|
Boost-Commit : |
Subject: [Boost-commit] svn:boost r58050 - in sandbox/itl/boost: itl itl/detail itl_xt itl_xt/detail validate/driver validate/gentor validate/laws validate/validater
From: afojgo_at_[hidden]
Date: 2009-11-30 05:18:54
Author: jofaber
Date: 2009-11-30 05:18:48 EST (Mon, 30 Nov 2009)
New Revision: 58050
URL: http://svn.boost.org/trac/boost/changeset/58050
Log:
Added law based tests for element_iterators. Bugfixed bit_element_iterators for interval_bitset.
Added documentation on element_iterators. Stable {msvc-9.0}
Added:
sandbox/itl/boost/validate/driver/sorted_associative_bitset_driver.hpp (contents, props changed)
sandbox/itl/boost/validate/driver/sorted_associative_map_driver.hpp (contents, props changed)
sandbox/itl/boost/validate/driver/sorted_associative_set_driver.hpp (contents, props changed)
sandbox/itl/boost/validate/laws/atomic_equivalence.hpp (contents, props changed)
sandbox/itl/boost/validate/validater/sorted_associative_validater.hpp (contents, props changed)
Text files modified:
sandbox/itl/boost/itl/detail/mapped_reference.hpp | 13 +
sandbox/itl/boost/itl/interval_base_map.hpp | 8
sandbox/itl/boost/itl/interval_base_set.hpp | 8
sandbox/itl/boost/itl_xt/bits.hpp | 48 +++-
sandbox/itl/boost/itl_xt/detail/bit_element_iterator.hpp | 364 +++++++++++++++++++++++++++++----------
sandbox/itl/boost/itl_xt/interval_bitset.hpp | 80 +++++++-
sandbox/itl/boost/validate/gentor/randomgentor.hpp | 13
sandbox/itl/boost/validate/laws/function_equality.hpp | 2
sandbox/itl/boost/validate/validater/law_validater.hpp | 11
9 files changed, 395 insertions(+), 152 deletions(-)
Modified: sandbox/itl/boost/itl/detail/mapped_reference.hpp
==============================================================================
--- sandbox/itl/boost/itl/detail/mapped_reference.hpp (original)
+++ sandbox/itl/boost/itl/detail/mapped_reference.hpp 2009-11-30 05:18:48 EST (Mon, 30 Nov 2009)
@@ -8,6 +8,9 @@
#ifndef BOOST_ITL_DETAIL_MAPPED_REFERENCE_HPP_JOFA_091108
#define BOOST_ITL_DETAIL_MAPPED_REFERENCE_HPP_JOFA_091108
+#include <boost/type_traits/is_const.hpp>
+#include <boost/mpl/if.hpp>
+
namespace boost{namespace itl
{
@@ -17,11 +20,15 @@
typedef FirstT first_type;
typedef SecondT second_type;
typedef mapped_reference type;
+ typedef typename
+ mpl::if_<is_const<second_type>,
+ second_type&,
+ const second_type&>::type second_reference_type;
- const FirstT& first;
- SecondT& second;
+ const FirstT& first;
+ second_reference_type second;
- mapped_reference(const FirstT& fst, SecondT& snd) : first(fst), second(snd){}
+ mapped_reference(const FirstT& fst, second_reference_type snd) : first(fst), second(snd){}
template<class FstT, class SndT>
mapped_reference(const mapped_reference<FstT, SndT>& source):
Modified: sandbox/itl/boost/itl/interval_base_map.hpp
==============================================================================
--- sandbox/itl/boost/itl/interval_base_map.hpp (original)
+++ sandbox/itl/boost/itl/interval_base_map.hpp 2009-11-30 05:18:48 EST (Mon, 30 Nov 2009)
@@ -669,13 +669,13 @@
//==========================================================================
element_iterator elements_begin(){ return element_iterator(this->begin()); }
element_iterator elements_end() { return element_iterator(this->end()); }
- element_const_iterator elements_begin()const{ return element_iterator(this->begin()); }
- element_const_iterator elements_end() const{ return element_iterator(this->end()); }
+ element_const_iterator elements_begin()const{ return element_const_iterator(this->begin()); }
+ element_const_iterator elements_end() const{ return element_const_iterator(this->end()); }
element_reverse_iterator elements_rbegin(){ return element_reverse_iterator(this->rbegin()); }
element_reverse_iterator elements_rend() { return element_reverse_iterator(this->rend()); }
- element_const_reverse_iterator elements_rbegin()const{ return element_reverse_iterator(this->rbegin()); }
- element_const_reverse_iterator elements_rend() const{ return element_reverse_iterator(this->rend()); }
+ element_const_reverse_iterator elements_rbegin()const{ return element_const_reverse_iterator(this->rbegin()); }
+ element_const_reverse_iterator elements_rend() const{ return element_const_reverse_iterator(this->rend()); }
//==========================================================================
//= Representation
Modified: sandbox/itl/boost/itl/interval_base_set.hpp
==============================================================================
--- sandbox/itl/boost/itl/interval_base_set.hpp (original)
+++ sandbox/itl/boost/itl/interval_base_set.hpp 2009-11-30 05:18:48 EST (Mon, 30 Nov 2009)
@@ -417,13 +417,13 @@
//==========================================================================
element_iterator elements_begin(){ return element_iterator(this->begin()); }
element_iterator elements_end() { return element_iterator(this->end()); }
- element_const_iterator elements_begin()const{ return element_iterator(this->begin()); }
- element_const_iterator elements_end() const{ return element_iterator(this->end()); }
+ element_const_iterator elements_begin()const{ return element_const_iterator(this->begin()); }
+ element_const_iterator elements_end() const{ return element_const_iterator(this->end()); }
element_reverse_iterator elements_rbegin(){ return element_reverse_iterator(this->rbegin()); }
element_reverse_iterator elements_rend() { return element_reverse_iterator(this->rend()); }
- element_const_reverse_iterator elements_rbegin()const{ return element_reverse_iterator(this->rbegin()); }
- element_const_reverse_iterator elements_rend() const{ return element_reverse_iterator(this->rend()); }
+ element_const_reverse_iterator elements_rbegin()const{ return element_const_reverse_iterator(this->rbegin()); }
+ element_const_reverse_iterator elements_rend() const{ return element_const_reverse_iterator(this->rend()); }
//==========================================================================
//= Morphisms
Modified: sandbox/itl/boost/itl_xt/bits.hpp
==============================================================================
--- sandbox/itl/boost/itl_xt/bits.hpp (original)
+++ sandbox/itl/boost/itl_xt/bits.hpp 2009-11-30 05:18:48 EST (Mon, 30 Nov 2009)
@@ -64,7 +64,8 @@
typedef bit_range_type bit_type;
typedef bit_type element_type; // pretty short: 0 <= max < digits
typedef bit_type size_type;
- BOOST_STATIC_CONSTANT(bit_type, digits = std::numeric_limits<NaturalT>::digits);
+ BOOST_STATIC_CONSTANT(bit_type, digits = std::numeric_limits<NaturalT>::digits);
+ BOOST_STATIC_CONSTANT(word_type, w1 = static_cast<word_type>(1) );
bits():_bits(){}
explicit bits(word_type value):_bits(value){}
@@ -91,11 +92,13 @@
bool operator == (const bits& value)const{return _bits == value._bits;}
bool empty()const { return _bits == 0; }
- bool contains(element_type element)const { return 0 != ((1 << element) & _bits); }
+ bool contains(element_type element)const { return 0 != ((w1 << element) & _bits); }
bool contains(const bits& sub)const { return inclusion::subset==inclusion_compare(sub,*this); }
size_type cardinality()const{ return bitcount::count<word_type, digits>::apply(_bits); }
size_type size()const { return cardinality(); }
+ std::string as_string(const char off_on[2] = " 1")const;
+
private:
word_type _bits;
};
@@ -120,6 +123,15 @@
else return inclusion::equal;
}
+template<class NaturalT>
+std::string bits<NaturalT>::as_string(const char off_on[2])const
+{
+ std::string sequence;
+ for(int bit=0; bit < digits; bit++)
+ sequence += contains(bit) ? off_on[1] : off_on[0];
+ return sequence;
+}
+
template<class CharType, class CharTraits, class NaturalT>
std::basic_ostream<CharType, CharTraits>& operator <<
@@ -183,21 +195,21 @@
};
-//template<>
-//struct count<unsigned int, 32>
-//{
-// typedef unsigned int word_type;
-// typedef count<word_type,32> type;
-//
-// static bit_range_type apply(word_type value)
-// {
-// return table[ value & 0xfful]
-// + table[(value >> 8) & 0xfful]
-// + table[(value >> 16) & 0xfful]
-// + table[(value >> 24) & 0xfful];
-// }
-//
-//};
+template<>
+struct count<unsigned int, 32>
+{
+ typedef unsigned int word_type;
+ typedef count<word_type,32> type;
+
+ static bit_range_type apply(word_type value)
+ {
+ return table[ value & 0xfful]
+ + table[(value >> 8) & 0xfful]
+ + table[(value >> 16) & 0xfful]
+ + table[(value >> 24) & 0xfful];
+ }
+
+};
template<>
struct count<nat64, 64>
@@ -205,7 +217,7 @@
typedef nat64 word_type;
typedef count<word_type,64> type;
- static bit_range_type compute(word_type value)
+ static bit_range_type apply(word_type value)
{
return table[ value & 0xffull]
+ table[(value >> 8) & 0xffull]
Modified: sandbox/itl/boost/itl_xt/detail/bit_element_iterator.hpp
==============================================================================
--- sandbox/itl/boost/itl_xt/detail/bit_element_iterator.hpp (original)
+++ sandbox/itl/boost/itl_xt/detail/bit_element_iterator.hpp 2009-11-30 05:18:48 EST (Mon, 30 Nov 2009)
@@ -1,5 +1,8 @@
/*-----------------------------------------------------------------------------+
Copyright (c) 2009-2009: Joachim Faulhaber
+Copyright (c) 1998: Charles E. Leiserson, Harald Prokop, Keith H. Randall
+ (Bit sequencing using DeBruin sequence
+ http://supertech.csail.mit.edu/papers/debruijn.pdf)
+------------------------------------------------------------------------------+
Distributed under the Boost Software License, Version 1.0.
(See accompanying file LICENCE.txt or copy at
@@ -9,15 +12,11 @@
#define BOOST_ITL_XT_DETAIL_BIT_ELEMENT_ITERATOR_HPP_JOFA_091109
#include <boost/itl_xt/bits.hpp>
+#include <boost/mpl/not.hpp>
namespace boost{namespace itl
{
-namespace iterator_state
-{
- enum { dereferencable, end };
-}
-
//------------------------------------------------------------------------------
template<class SegmentT> struct bitwise;
@@ -28,11 +27,15 @@
typedef DomainT domain_type;
typedef DomainT codomain_type;
typedef DomainT element_type;
+ typedef BitSetT bitset_type;
typedef typename BitSetT::word_type word_type;
BOOST_STATIC_CONSTANT(bit_range_type, digits = BitSetT::digits);
};
+namespace biterate
+{ template<class IteratorT, bool Forward> struct proceed; }
+
template <class SegmentIteratorT>
class bit_element_iterator
: public boost::iterator_facade<
@@ -47,9 +50,24 @@
typedef typename SegmentIteratorT::value_type segment_type;
typedef typename first_element<segment_type>::type interval_type;
typedef typename interval_type::difference_type domain_difference_type;
+ typedef typename bitwise<segment_type>::bitset_type bitset_type;
+ typedef typename bitwise<segment_type>::word_type word_type;
typedef typename bitwise<segment_type>::domain_type domain_type;
typedef typename bitwise<segment_type>::codomain_type codomain_type;
typedef typename bitwise<segment_type>::element_type element_type;
+ typedef element_type value_type;
+ typedef element_type key_type;
+ typedef element_type data_type;
+
+ BOOST_STATIC_CONSTANT(bit_range_type, digits = bitwise<segment_type>::digits );
+ BOOST_STATIC_CONSTANT(bool, is_forward = mpl::not_<is_reverse<SegmentIteratorT> >::value );
+
+ typedef typename biterate::proceed<segment_iterator,is_forward> Proceed;
+
+ BOOST_STATIC_CONSTANT(bit_range_type, before = Proceed::before );
+ BOOST_STATIC_CONSTANT(bit_range_type, ante = Proceed::ante );
+ BOOST_STATIC_CONSTANT(bit_range_type, past = Proceed::past );
+ BOOST_STATIC_CONSTANT(bit_range_type, beyond = Proceed::beyond );
private:
struct enabler{};
@@ -59,16 +77,14 @@
bit_element_iterator()
: _saltator(neutron<segment_iterator>::value())
, _reptator(neutron<domain_difference_type>::value())
- , _on_bit(ante)
+ , _on_bit(before)
{}
- explicit bit_element_iterator(segment_iterator jumper, int state = iterator_state::dereferencable)
+ bit_element_iterator(segment_iterator jumper, bit_range_type start_pos)
: _saltator(jumper)
, _reptator(neutron<domain_difference_type>::value())
- {
- if(state == iterator_state::dereferencable)
- _on_bit = biterate::proceed<word_type,digits>::next(jumper->second.word(), ante);
- }
+ , _on_bit(start_pos)
+ {}
template <class SaltatorT>
bit_element_iterator
@@ -80,11 +96,7 @@
{}
private:
- typedef typename bitwise<segment_type>::word_type word_type;
- BOOST_STATIC_CONSTANT(bit_range_type, digits = bitwise<segment_type>::digits );
- BOOST_STATIC_CONSTANT(bit_range_type, shift = log2_<digits>::value );
- BOOST_STATIC_CONSTANT(bit_range_type, past = digits );
- BOOST_STATIC_CONSTANT(bit_range_type, ante = -1 );
+ BOOST_STATIC_CONSTANT(bit_range_type, shift = log2_<digits>::value );
friend class boost::iterator_core_access;
template <class> friend class bit_element_iterator;
@@ -92,72 +104,128 @@
template <class SaltatorT>
bool equal(bit_element_iterator<SaltatorT> const& other) const
{
- return this->_saltator == other._saltator
- && this->_reptator == other._reptator;
+ if( _saltator != other._saltator)
+ return false;
+ else if(_reptator != other._reptator)
+ return false;
+ else if(this->_on_bit == ante)
+ return other._on_bit == beyond || other.is_segment_begin();
+ else
+ return _on_bit == other._on_bit;
}
void increment()
{
- if(!next_bit()) // find and update the next on bit.
- {
+ if(_on_bit == ante)
+ first_bit();
+
+ next_bit();
+ if(_on_bit == past)
+ { // The current bitset passed the end
if(_reptator < pred(_saltator->first.length()))
- {
+ {
++_reptator;
- _on_bit = ante;
- }
+ _on_bit = ante;
+ }
else
{
++_saltator;
+ // NOTE: increment and dereference are unsecure now, because
+ // _saltator can (finally) be end here. decrement is secure.
_reptator = neutron<domain_difference_type>::value();
- _on_bit = ante;
+ _on_bit = ante;
}
- // The existence of at least one bit is asserted (absorber trait)
}
}
void decrement()
{
- if(!prev_bit()) // find and update the previous on bit.
- {
+ prev_bit();
+ if(_on_bit == ante)
+ { // The current bitset passed the beginning
if(neutron<domain_difference_type>::value() < _reptator)
- --_reptator;
+ {
+ --_reptator;
+ _on_bit = past;
+ }
else
{
+ //assert: _saltator is not at begin here.
--_saltator;
- _reptator = _saltator->first.length();
- --_reptator;
+ // NOW: decrement insecure, because _saltator can (finally) be
+ // begin here. increment and dereference are secure.
+ _reptator = _saltator->first.length();
+ --_reptator;
+ _on_bit = past;
}
- // The existence of at least one bit is asserted (absorber trait)
- _on_bit = past;
- next_bit();
}
}
element_type dereference()const
{
- return (_saltator->first.first() << shift) + _reptator + _on_bit;
+ if(_on_bit == ante)
+ first_bit();
+ else if(_on_bit == past)
+ last_bit();
+
+ return (Proceed::inter_value(_reptator, _saltator->first) << shift) + _on_bit;
+ }
+
+ void first_bit()const
+ {
+ // Because interval_bitsets are neutron absorbers, _saltator->second.word() is not a neutron
+ _on_bit = Proceed::first_bit(_saltator->second.word());
+ }
+
+ void last_bit()const
+ {
+ // Because interval_bitsets are neutron absorbers, _saltator->second.word() is not a neutron
+ _on_bit = Proceed::last_bit(_saltator->second.word());
}
bool next_bit()
{
- BOOST_ASSERT(ante <= _on_bit && _on_bit < past);
- _on_bit = biterate::proceed<word_type,digits>::next(_saltator->second.word(), _on_bit);
+ if(_on_bit == before)
+ {
+ ++_saltator;
+ _reptator = neutron<domain_difference_type>::value();
+ _on_bit = Proceed::first_bit(_saltator->second.word());
+ }
+ else
+ _on_bit = Proceed::next_bit(_saltator->second.word(), _on_bit);
+
return _on_bit != past;
}
bool prev_bit()
{
- BOOST_ASSERT(ante < _on_bit && _on_bit <= past);
- _on_bit = biterate::proceed<word_type,digits>::prev(_saltator->second.word(), _on_bit);
+ if(_on_bit == beyond)
+ {
+ --_saltator;
+ _reptator = _saltator->first.length();
+ --_reptator;
+ _on_bit = Proceed::last_bit(_saltator->second.word());
+ }
+ else
+ _on_bit = Proceed::prev_bit(_saltator->second.word(), _on_bit);
+
return _on_bit != ante;
}
+ bool is_segment_begin()const
+ {
+ return _reptator == neutron<domain_difference_type>::value()
+ && 0 <= _on_bit && _on_bit < digits
+ && _on_bit == Proceed::first_bit(_saltator->second.word());
+ }
+
private:
segment_iterator _saltator; // satltare: to jump : the fast moving iterator
mutable domain_difference_type _reptator; // reptare: to sneak : the slow moving iterator 0 based
mutable bit_range_type _on_bit; // position of the current on bit.
// -1 <= _on_bit <= digits
- // rend() end()
+ // rend() end()
+
};
namespace biterate
@@ -169,7 +237,15 @@
# pragma warning( disable : 4146 )
#endif
+/* Bit-iteration is coded on the bases of the work of
+Charles E. Leiserson, Harald Prokop, Keith H. Randall
+ http://supertech.csail.mit.edu/papers/debruijn.pdf
+
+and also Sean Eron Anderson:
+http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogDeBruijn
+*/
+//DeBruin sequence
static unsigned char index32[] =
{
0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8,
@@ -187,28 +263,29 @@
}
template<typename WordT, bit_range_type Digits>
-struct proceed
+struct forward
{
typedef nat32 word_type;
- typedef proceed<WordT, Digits> type;
+ typedef forward<WordT, Digits> type;
- BOOST_STATIC_CONSTANT( word_type, digits = Digits );
- BOOST_STATIC_CONSTANT( word_type, w1 = static_cast<word_type>(1) );
- BOOST_STATIC_CONSTANT( word_type, top = w1 << (digits-w1) );
- BOOST_STATIC_CONSTANT( word_type, factor = 0x077CB531U );
- BOOST_STATIC_CONSTANT( word_type, shift = 27 );
- BOOST_STATIC_CONSTANT( bit_range_type, ante = -1 );
- BOOST_STATIC_CONSTANT( bit_range_type, past = digits );
- BOOST_STATIC_CONSTANT( bit_range_type, last = past-1 );
+ BOOST_STATIC_CONSTANT( word_type, digits = Digits );
+ BOOST_STATIC_CONSTANT( word_type, w1 = static_cast<word_type>(1) );
+ BOOST_STATIC_CONSTANT( word_type, top = w1 << (digits-w1) );
+ BOOST_STATIC_CONSTANT( word_type, factor = 0x077CB531U );
+ BOOST_STATIC_CONSTANT( word_type, shift = 27 );
+ BOOST_STATIC_CONSTANT( bit_range_type, ante = -1 );
+ BOOST_STATIC_CONSTANT( bit_range_type, past = digits );
+ BOOST_STATIC_CONSTANT( bit_range_type, last = past-1 );
- static bit_range_type next(word_type value, bit_range_type cur_pos)
+ static bit_range_type first_bit(word_type value)
{
- BOOST_ASSERT( ante <= cur_pos && cur_pos < past );
+ return index32[(((value & -value) * factor)) >> shift];
+ }
+ static bit_range_type next_bit(word_type value, bit_range_type cur_pos)
+ {
if(cur_pos == last)
return past;
- else if(cur_pos == ante)
- return index32[(((value & -value) * factor)) >> shift];
else
{
// next contains all bits of value above cur_pos
@@ -220,14 +297,15 @@
}
}
- static bit_range_type prev(word_type value, bit_range_type cur_pos)
+ static bit_range_type last_bit(word_type value)
{
- BOOST_ASSERT(ante < cur_pos && cur_pos <= past);
+ return index32[((high_bit(value) * factor)) >> shift];
+ }
+ static bit_range_type prev_bit(word_type value, bit_range_type cur_pos)
+ {
if(cur_pos == 0)
return ante;
- else if(cur_pos == past)
- return index32[((high_bit(value) * factor)) >> shift];
else
{
// next contains all bits of value above cur_pos
@@ -241,22 +319,21 @@
};
-template<> struct proceed<nat64, 64>
+template<> struct forward<nat64, 64>
{
typedef nat64 word_type;
typedef nat32 half_type;
- typedef proceed<word_type,64> type;
-
- BOOST_STATIC_CONSTANT( word_type, digits = 64 );
- BOOST_STATIC_CONSTANT( word_type, w1 = static_cast<word_type>(1) );
- BOOST_STATIC_CONSTANT( word_type, top = w1 << (digits-w1) );
- BOOST_STATIC_CONSTANT( half_type, factor = 0x077CB531U );
- BOOST_STATIC_CONSTANT( half_type, shift = 27 );
- BOOST_STATIC_CONSTANT( bit_range_type, ante = -1 );
- BOOST_STATIC_CONSTANT( bit_range_type, past = digits );
- BOOST_STATIC_CONSTANT( bit_range_type, last = past-1 );
- BOOST_STATIC_CONSTANT( bit_range_type, half = 32 );
+ typedef forward<word_type,64> type;
+ BOOST_STATIC_CONSTANT( word_type, digits = 64 );
+ BOOST_STATIC_CONSTANT( word_type, w1 = static_cast<word_type>(1) );
+ BOOST_STATIC_CONSTANT( word_type, top = w1 << (digits-w1) );
+ BOOST_STATIC_CONSTANT( half_type, factor = 0x077CB531U );
+ BOOST_STATIC_CONSTANT( half_type, shift = 27 );
+ BOOST_STATIC_CONSTANT( bit_range_type, ante = -1 );
+ BOOST_STATIC_CONSTANT( bit_range_type, past = digits );
+ BOOST_STATIC_CONSTANT( bit_range_type, last = past-1 );
+ BOOST_STATIC_CONSTANT( bit_range_type, half = 32 );
BOOST_STATIC_CONSTANT( word_type, lower_mask = (w1 << 32)-w1 );
@@ -270,23 +347,22 @@
return static_cast<half_type>(value >> half) & ~((1<<(cur_pos-half+1))-1);
}
- static bit_range_type next(word_type value, bit_range_type cur_pos)
+ static bit_range_type first_bit(word_type value)
{
- BOOST_ASSERT(cur_pos < past );
+ half_type lower = static_cast<half_type>(lower_mask & value);
+ if(lower)
+ return index32[(((lower & -lower) * factor)) >> shift];
+ else
+ {
+ half_type upper = static_cast<half_type>(value >> half);
+ return half + index32[(((upper & -upper) * factor)) >> shift];
+ }
+ }
+ static bit_range_type next_bit(word_type value, bit_range_type cur_pos)
+ {
if(cur_pos == last)
return past;
- else if(cur_pos == ante)
- {
- half_type lower = static_cast<half_type>(lower_mask & value);
- if(lower)
- return index32[(((lower & -lower) * factor)) >> shift];
- else
- {
- half_type upper = static_cast<half_type>(value >> half);
- return half + index32[(((upper & -upper) * factor)) >> shift];
- }
- }
else
{
half_type low_next, up_next;
@@ -298,11 +374,10 @@
else
if(low_next = lower_next(value, cur_pos))
return index32[(((low_next & -low_next) * factor)) >> shift];
- else
- {
- half_type up_next = upper_next(value, cur_pos);
+ else if(half_type up_next = upper_next(value, cur_pos))
return half + index32[(((up_next & -up_next) * factor)) >> shift];
- }
+ else
+ return past;
}
}
@@ -317,23 +392,22 @@
return static_cast<half_type>(value >> half) & ((1<<(cur_pos-half))-1);
}
- static bit_range_type prev(word_type value, bit_range_type cur_pos)
+ static bit_range_type last_bit(word_type value)
{
- BOOST_ASSERT(ante < cur_pos);
+ half_type upper = static_cast<half_type>(value >> half);
+ if(upper)
+ return half + index32[((high_bit(upper) * factor)) >> shift];
+ else
+ {
+ half_type lower = static_cast<half_type>(value & lower_mask);
+ return index32[((high_bit(lower) * factor)) >> shift];
+ }
+ }
+ static bit_range_type prev_bit(word_type value, bit_range_type cur_pos)
+ {
if(cur_pos == 0)
return ante;
- else if(cur_pos == past)
- {
- half_type upper = static_cast<half_type>(value >> half);
- if(upper)
- return half + index32[((high_bit(upper) * factor)) >> shift];
- else
- {
- half_type lower = static_cast<half_type>(value & lower_mask);
- return index32[((high_bit(lower) * factor)) >> shift];
- }
- }
else
{
half_type up_prev, low_prev;
@@ -351,9 +425,101 @@
return half + index32[((high_bit(up_prev) * factor)) >> shift];
}
}
+};
+
+template<class IteratorT, bool Forward>
+struct proceed{};
+
+template<class IteratorT>
+struct proceed<IteratorT,true>
+{
+ typedef IteratorT iterator;
+ typedef typename iterator::value_type segment_type;
+ typedef typename first_element<segment_type>::type interval_type;
+ typedef typename interval_type::difference_type difference_type;
+ typedef typename bitwise<segment_type>::word_type word_type;
+
+ BOOST_STATIC_CONSTANT(bit_range_type, digits = bitwise<segment_type>::digits );
+ BOOST_STATIC_CONSTANT(bit_range_type, before = -2 );
+ BOOST_STATIC_CONSTANT(bit_range_type, ante = -1 );
+ BOOST_STATIC_CONSTANT(bit_range_type, past = digits );
+ BOOST_STATIC_CONSTANT(bit_range_type, beyond = digits+1 );
+
+ static bit_range_type first_bit(word_type value)
+ {
+ unsigned int dbg_word_value = value; //CL
+ return forward<word_type,digits>::first_bit(value);
+ }
+
+ static bit_range_type last_bit(word_type value)
+ { return forward<word_type,digits>::last_bit(value); }
+
+ static bit_range_type next_bit(word_type value, bit_range_type cur_pos)
+ { return forward<word_type,digits>::next_bit(value, cur_pos); }
+
+ static bit_range_type prev_bit(word_type value, bit_range_type cur_pos)
+ { return forward<word_type,digits>::prev_bit(value, cur_pos); }
+
+ static difference_type inter_value(difference_type reptator, const interval_type inter_val)
+ {
+ return inter_val.first() + reptator;
+ }
+
+ static difference_type inter_base(const iterator& iter)
+ {
+ return neutron<difference_type>::value();
+ }
+
+ static difference_type inter_ceil(const iterator& iter)
+ {
+ return iter->first.length();
+ }
+};
+template<class IteratorT>
+struct proceed<IteratorT,false>
+{
+ typedef IteratorT iterator;
+ typedef typename iterator::value_type segment_type;
+ typedef typename first_element<segment_type>::type interval_type;
+ typedef typename interval_type::difference_type difference_type;
+ typedef typename bitwise<segment_type>::word_type word_type;
+
+ BOOST_STATIC_CONSTANT(bit_range_type, digits = bitwise<segment_type>::digits );
+ BOOST_STATIC_CONSTANT(bit_range_type, beyond = -2 );
+ BOOST_STATIC_CONSTANT(bit_range_type, past = -1 );
+ BOOST_STATIC_CONSTANT(bit_range_type, ante = digits );
+ BOOST_STATIC_CONSTANT(bit_range_type, before = digits+1 );
+
+ static bit_range_type first_bit(word_type value)
+ { return forward<word_type,digits>::last_bit(value); }
+
+ static bit_range_type last_bit(word_type value)
+ { return forward<word_type,digits>::first_bit(value); }
+
+ static bit_range_type next_bit(word_type value, bit_range_type cur_pos)
+ { return forward<word_type,digits>::prev_bit(value, cur_pos); }
+
+ static bit_range_type prev_bit(word_type value, bit_range_type cur_pos)
+ { return forward<word_type,digits>::next_bit(value, cur_pos); }
+
+ static difference_type inter_value(difference_type reptator, const interval_type inter_val)
+ {
+ return inter_val.last() - reptator;
+ }
+
+ static difference_type inter_base(const iterator& iter)//CL . . .
+ {
+ return iter->first.length();
+ }
+
+ static difference_type inter_ceil(const iterator& iter)
+ {
+ return neutron<difference_type>::value();
+ }
};
+
#if (defined _MSC_VER)
# pragma warning( pop ) // C4146: unary minus operator applied to unsigned type,
// result still unsigned
Modified: sandbox/itl/boost/itl_xt/interval_bitset.hpp
==============================================================================
--- sandbox/itl/boost/itl_xt/interval_bitset.hpp (original)
+++ sandbox/itl/boost/itl_xt/interval_bitset.hpp 2009-11-30 05:18:48 EST (Mon, 30 Nov 2009)
@@ -16,7 +16,9 @@
#include <boost/itl_xt/meta_log.hpp> // a meta logarithm
#include <boost/itl_xt/bits.hpp> // a bitset implementation
#include <boost/itl_xt/detail/bit_element_iterator.hpp>
-//CL itl\boost\itl_xt\detail\bit_element_iterator.hpp
+
+#include <boost/itl/interval_morphism.hpp> //JODO Separate aspects and concerns
+
namespace boost{namespace itl
{
@@ -163,21 +165,56 @@
//==========================================================================
//= Element iterator related
//==========================================================================
- element_iterator elements_begin(){ return element_iterator(this->begin()); }
- element_iterator elements_end() { return element_iterator(this->end(), iterator_state::end); }
- element_const_iterator elements_begin()const{ return element_iterator(this->begin()); }
- element_const_iterator elements_end() const{ return element_iterator(this->end(), iterator_state::end); }
-
- element_reverse_iterator elements_rbegin(){ return element_reverse_iterator(this->rbegin()); }
- element_reverse_iterator elements_rend() { return element_reverse_iterator(this->rend(), iterator_state::end); }
- element_const_reverse_iterator elements_rbegin()const{ return element_reverse_iterator(this->rbegin()); }
- element_const_reverse_iterator elements_rend() const{ return element_reverse_iterator(this->rend(), iterator_state::end); }
+ element_iterator elements_begin()
+ {
+ if(this->begin()==this->end())
+ return element_iterator(this->begin(), element_iterator::beyond);
+ else
+ return element_iterator(this->begin(), element_iterator::ante );
+ }
+
+ element_iterator elements_end()
+ { return element_iterator(this->end(), element_iterator::beyond); }
+
+ element_const_iterator elements_begin()const
+ {
+ if(this->begin()==this->end())
+ return element_const_iterator(this->begin(), element_iterator::beyond);
+ else
+ return element_const_iterator(this->begin(), element_iterator::ante );
+ }
+
+ element_const_iterator elements_end()const
+ { return element_const_iterator(this->end(), element_iterator::beyond); }
+
+ element_reverse_iterator elements_rbegin()
+ {
+ if(this->rbegin()==this->rend())
+ return element_reverse_iterator(this->rbegin(), element_iterator::before);
+ else
+ return element_reverse_iterator(this->rbegin(), element_iterator::past );
+ }
+
+ element_reverse_iterator elements_rend()
+ { return element_reverse_iterator(this->rend(), element_iterator::before); }
+
+ element_const_reverse_iterator elements_rbegin()const
+ {
+ if(this->rbegin()==this->rend())
+ return element_const_reverse_iterator(this->rbegin(), element_iterator::before);
+ else
+ return element_const_reverse_iterator(this->rbegin(), element_iterator::past );
+ }
+
+ element_const_reverse_iterator elements_rend()const
+ { return element_const_reverse_iterator(this->rend(), element_iterator::before); }
private:
typedef typename interval_bitmap_type::segment_type seg_type;
BOOST_STATIC_CONSTANT( word_type, digits = bitset_type::digits );
BOOST_STATIC_CONSTANT( word_type, divisor = digits );
+ BOOST_STATIC_CONSTANT( word_type, last = digits-1 );
BOOST_STATIC_CONSTANT( word_type, shift = log2_<divisor>::value );
BOOST_STATIC_CONSTANT( word_type, w1 = static_cast<word_type>(1) );
BOOST_STATIC_CONSTANT( word_type, mask = divisor - w1 );
@@ -189,11 +226,11 @@
typedef void (interval_bitset::*segment_combiner)(element_type, element_type, bitset_type);
- static word_type from_lower_to(word_type bit){return bit==top ? all : (1<<(bit+1))-1;}
- static word_type to_upper_from(word_type bit){return bit==top ? top : ~((1<<bit)-1); }
+ static word_type from_lower_to(word_type bit){return bit==last ? all : (w1<<(bit+w1))-w1;}
+ static word_type to_upper_from(word_type bit){return bit==last ? top : ~((w1<<bit)-w1); }
interval_bitset& segment_apply(segment_combiner combine, const interval_type& operand)
- { // same as
+ { // same as
condensed_type base = operand.first() >> shift, // operand.first()/ divisor
ceil = operand.last() >> shift; // operand.last() / divisor
word_type base_rest = operand.first() & mask , // operand.first()% divisor
@@ -383,6 +420,23 @@
}
};
+namespace Interval
+{
+ template <typename DomainT, typename BitSetT>
+ struct Atomize<itl::set<DomainT>, interval_bitset<DomainT, BitSetT> >
+ {
+ void operator()( itl::set<DomainT>& atomized,
+ const interval_bitset<DomainT, BitSetT>& clustered)
+ {
+ typedef interval_bitset<DomainT, BitSetT> InterBitsetT;
+ InterBitsetT::element_const_iterator bit_ = clustered.elements_begin();
+ while(bit_ != clustered.elements_end())
+ atomized.insert(*bit_++);
+ }
+ };
+
+} // namespace Interval
+
}} // namespace itl boost
Added: sandbox/itl/boost/validate/driver/sorted_associative_bitset_driver.hpp
==============================================================================
--- (empty file)
+++ sandbox/itl/boost/validate/driver/sorted_associative_bitset_driver.hpp 2009-11-30 05:18:48 EST (Mon, 30 Nov 2009)
@@ -0,0 +1,72 @@
+/*-----------------------------------------------------------------------------+
+A Law Based Test Automaton 'LaBatea'
+Author: Joachim Faulhaber
+Copyright (c) 2007-2009: Joachim Faulhaber
++------------------------------------------------------------------------------+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENCE.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
++-----------------------------------------------------------------------------*/
+#ifndef BOOST_VALIDATE_DRIVER_SORTED_ASSOCIATIVE_BITSET_DRIVER_HPP_JOFA_091126
+#define BOOST_VALIDATE_DRIVER_SORTED_ASSOCIATIVE_BITSET_DRIVER_HPP_JOFA_091126
+
+#include <iostream>
+#include <stdio.h>
+#include <boost/validate/validater/sorted_associative_validater.hpp>
+#include <boost/validate/driver/itl_driver.hpp>
+#include <boost/validate/utility.hpp>
+
+namespace boost{namespace itl
+{
+
+ class sorted_associative_bitset_driver : public itl_driver
+ {
+ public:
+ sorted_associative_bitset_driver() { setProfile(); }
+
+ void setProfile()
+ {
+ setValid(true);
+ _freeChoice.setSize(FreeChoice::FreeChoice_size);
+ _freeChoice.setMaxWeights(100);
+ _freeChoice[FreeChoice::_1] = 20;
+ _freeChoice[FreeChoice::_2] = 20;
+ _freeChoice[FreeChoice::_3] = 20;
+ _freeChoice[FreeChoice::_4] = 20;
+ _freeChoice[FreeChoice::_5] = 20;
+ setRootTypeNames();
+ _freeChoice.init();
+
+ if(!_freeChoice.is_consistent())
+ {
+ setValid(false);
+ std::cout << _freeChoice.inconsitencyMessage("interval_bitset_driver::setProfile()") << std::endl;
+ }
+ }
+
+ algebra_validater* chooseValidater()
+ {
+ int freeChoice = _freeChoice.some();
+
+ switch(freeChoice)
+ {
+ case FreeChoice::_1:
+ return new sorted_associative_validater< interval_bitset<int, bits<unsigned char> >, itl::list<int> >;
+ case FreeChoice::_2:
+ return new sorted_associative_validater< interval_bitset<int, bits<unsigned short> >, itl::list<int> >;
+ case FreeChoice::_3:
+ return new sorted_associative_validater< interval_bitset<int, bits<unsigned int> >, itl::list<int> >;
+ case FreeChoice::_4:
+ return new sorted_associative_validater< interval_bitset<int, bits<unsigned long> >, itl::list<int> >;
+ case FreeChoice::_5:
+ return new sorted_associative_validater< interval_bitset<int, bits<unsigned long long> >, itl::list<int> >;
+ default: return choiceError(ITL_LOCATION("freeChoice:\n"), freeChoice, _freeChoice);
+ } //switch()
+
+ return NULL; //just to please the compiler ;)
+ }
+ };
+
+}} // namespace itl boost
+
+#endif // BOOST_VALIDATE_DRIVER_SORTED_ASSOCIATIVE_BITSET_DRIVER_HPP_JOFA_091126
Added: sandbox/itl/boost/validate/driver/sorted_associative_map_driver.hpp
==============================================================================
--- (empty file)
+++ sandbox/itl/boost/validate/driver/sorted_associative_map_driver.hpp 2009-11-30 05:18:48 EST (Mon, 30 Nov 2009)
@@ -0,0 +1,135 @@
+/*-----------------------------------------------------------------------------+
+A Law Based Test Automaton 'LaBatea'
+Author: Joachim Faulhaber
+Copyright (c) 2007-2009: Joachim Faulhaber
++------------------------------------------------------------------------------+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENCE.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
++-----------------------------------------------------------------------------*/
+#ifndef BOOST_VALIDATE_DRIVER_SORTED_ASSOCIATIVE_MAP_DRIVER_HPP_JOFA_091126
+#define BOOST_VALIDATE_DRIVER_SORTED_ASSOCIATIVE_MAP_DRIVER_HPP_JOFA_091126
+
+#include <iostream>
+#include <stdio.h>
+#include <boost/validate/validater/sorted_associative_validater.hpp>
+#include <boost/validate/driver/itl_driver.hpp>
+#include <boost/validate/utility.hpp>
+
+namespace boost{namespace itl
+{
+
+ class sorted_associative_map_driver : public itl_driver
+ {
+ public:
+ sorted_associative_map_driver() { setProfile(); }
+
+ void setProfile()
+ {
+ setValid(true);
+ _rootChoice.setSize(RootType::Types_size);
+ _rootChoice.setMaxWeights(100);
+ _rootChoice[RootType::itl_set] = 0;
+ _rootChoice[RootType::interval_set] = 0;
+ _rootChoice[RootType::separate_interval_set] = 0;
+ _rootChoice[RootType::split_interval_set] = 0;
+ _rootChoice[RootType::itl_map] = 0;
+ _rootChoice[RootType::interval_map] = 50;
+ _rootChoice[RootType::split_interval_map] = 50;
+ setRootTypeNames();
+ _rootChoice.init();
+
+ _domainChoice.setSize(DomainType::DomainTypes_size);
+ _domainChoice.setMaxWeights(100);
+ _domainChoice[DomainType::Int] = 100;
+ _domainChoice[DomainType::Double] = 0;
+ setDomainTypeNames();
+ _domainChoice.init();
+
+ _codomainChoice.setSize(CodomainType::CodomainTypes_size);
+ _codomainChoice.setMaxWeights(100);
+ _codomainChoice[CodomainType::Nat] = 100;
+ _codomainChoice[CodomainType::Int] = 0;
+ _codomainChoice[CodomainType::Double] = 0;
+ _codomainChoice[CodomainType::set_int] = 0;
+ setCodomainTypeNames();
+ _codomainChoice.init();
+
+ _neutronizerChoice.setSize(NeutronHandlerType::NeutronHandlerTypes_size);
+ _neutronizerChoice.setMaxWeights(100);
+ _neutronizerChoice[NeutronHandlerType::partial_absorber] = 25;
+ _neutronizerChoice[NeutronHandlerType::partial_enricher] = 25;
+ _neutronizerChoice[NeutronHandlerType::total_absorber] = 25;
+ _neutronizerChoice[NeutronHandlerType::total_enricher] = 25;
+ setNeutronHandlerTypeNames();
+ _neutronizerChoice.init();
+
+ if(!_rootChoice.is_consistent())
+ {
+ setValid(false);
+ std::cout << _rootChoice.inconsitencyMessage("sorted_associative_map_driver::setProfile()") << std::endl;
+ }
+
+ if(!_domainChoice.is_consistent())
+ {
+ setValid(false);
+ std::cout << _domainChoice.inconsitencyMessage("sorted_associative_map_driver::setProfile()") << std::endl;
+ }
+
+ if(!_codomainChoice.is_consistent())
+ {
+ setValid(false);
+ std::cout << _codomainChoice.inconsitencyMessage("sorted_associative_map_driver::setProfile()") << std::endl;
+ }
+
+ if(!_neutronizerChoice.is_consistent())
+ {
+ setValid(false);
+ std::cout << _neutronizerChoice.inconsitencyMessage("sorted_associative_map_driver::setProfile()") << std::endl;
+ }
+
+ }
+
+
+ algebra_validater* chooseValidater()
+ {
+ int rootChoice = _rootChoice.some();
+ int domainChoice = _domainChoice.some();
+ int codomainChoice = _codomainChoice.some();
+ int neutronizerChoice = _neutronizerChoice.some();
+
+ switch(rootChoice)
+ {
+ //-----------------------------------------------------------------
+ case RootType::interval_map: {
+ switch(neutronizerChoice) {
+ case NeutronHandlerType::partial_absorber: return new sorted_associative_validater<interval_map<int,int,partial_absorber>, itl::list<std::pair<int,int> > >;
+ case NeutronHandlerType::partial_enricher: return new sorted_associative_validater<interval_map<int,int,partial_enricher>, itl::list<std::pair<int,int> > >;
+ case NeutronHandlerType::total_absorber: return new sorted_associative_validater<interval_map<int,int,total_absorber >, itl::list<std::pair<int,int> > >;
+ case NeutronHandlerType::total_enricher: return new sorted_associative_validater<interval_map<int,int,total_enricher >, itl::list<std::pair<int,int> > >;
+ default: return choiceError(ITL_LOCATION("\nRootType::interval_map: neutronizerChoice:\n"), neutronizerChoice, _neutronizerChoice);
+ }//switch neutronizerChoice
+ }//case interval_map
+ //-----------------------------------------------------------------
+ case RootType::split_interval_map: {
+ switch(neutronizerChoice) {
+ case NeutronHandlerType::partial_absorber: return new sorted_associative_validater<split_interval_map<int,int,partial_absorber>, itl::list<std::pair<int,int> > >;
+ case NeutronHandlerType::partial_enricher: return new sorted_associative_validater<split_interval_map<int,int,partial_enricher>, itl::list<std::pair<int,int> > >;
+ case NeutronHandlerType::total_absorber: return new sorted_associative_validater<split_interval_map<int,int,total_absorber >, itl::list<std::pair<int,int> > >;
+ case NeutronHandlerType::total_enricher: return new sorted_associative_validater<split_interval_map<int,int,total_enricher >, itl::list<std::pair<int,int> > >;
+ default: return choiceError(ITL_LOCATION("\nRootType::split_interval_map: neutronizerChoice:\n"), neutronizerChoice, _neutronizerChoice);
+ }//switch neutronizerChoice
+ }//case split_interval_map
+ //-----------------------------------------------------------------
+
+ default: return choiceError(ITL_LOCATION("rootChoice:\n"), rootChoice, _rootChoice);
+ } //switch()
+
+ return NULL; //just to please the compiler ;)
+ }
+ };
+
+
+}} // namespace itl boost
+
+#endif // BOOST_VALIDATE_DRIVER_SORTED_ASSOCIATIVE_MAP_DRIVER_HPP_JOFA_091126
Added: sandbox/itl/boost/validate/driver/sorted_associative_set_driver.hpp
==============================================================================
--- (empty file)
+++ sandbox/itl/boost/validate/driver/sorted_associative_set_driver.hpp 2009-11-30 05:18:48 EST (Mon, 30 Nov 2009)
@@ -0,0 +1,116 @@
+/*-----------------------------------------------------------------------------+
+A Law Based Test Automaton 'LaBatea'
+Author: Joachim Faulhaber
+Copyright (c) 2007-2009: Joachim Faulhaber
++------------------------------------------------------------------------------+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENCE.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
++-----------------------------------------------------------------------------*/
+#ifndef BOOST_VALIDATE_DRIVER_SORTED_ASSOCIATIVE_SET_DRIVER_HPP_JOFA_091126
+#define BOOST_VALIDATE_DRIVER_SORTED_ASSOCIATIVE_SET_DRIVER_HPP_JOFA_091126
+
+#include <iostream>
+#include <stdio.h>
+#include <boost/validate/validater/sorted_associative_validater.hpp>
+#include <boost/validate/driver/itl_driver.hpp>
+#include <boost/validate/utility.hpp>
+
+namespace boost{namespace itl
+{
+
+ class sorted_associative_set_driver : public itl_driver
+ {
+ public:
+ sorted_associative_set_driver() { setProfile(); }
+
+ void setProfile()
+ {
+ setValid(true);
+ _rootChoice.setSize(RootType::Types_size);
+ _rootChoice.setMaxWeights(100);
+ _rootChoice[RootType::itl_set] = 0;
+ _rootChoice[RootType::interval_set] = 33;
+ _rootChoice[RootType::separate_interval_set] = 33;
+ _rootChoice[RootType::split_interval_set] = 34;
+ _rootChoice[RootType::itl_map] = 0;
+ _rootChoice[RootType::interval_map] = 0;
+ _rootChoice[RootType::split_interval_map] = 0;
+ setRootTypeNames();
+ _rootChoice.init();
+
+ _domainChoice.setSize(DomainType::DomainTypes_size);
+ _domainChoice.setMaxWeights(100);
+ _domainChoice[DomainType::Int] = 100;
+ _domainChoice[DomainType::Double] = 0;
+ setDomainTypeNames();
+ _domainChoice.init();
+
+ _codomainChoice.setSize(CodomainType::CodomainTypes_size);
+ _codomainChoice.setMaxWeights(100);
+ _codomainChoice[CodomainType::Nat] = 100;
+ _codomainChoice[CodomainType::Int] = 0;
+ _codomainChoice[CodomainType::Double] = 0;
+ _codomainChoice[CodomainType::set_int] = 0;
+ setCodomainTypeNames();
+ _codomainChoice.init();
+
+ _neutronizerChoice.setSize(NeutronHandlerType::NeutronHandlerTypes_size);
+ _neutronizerChoice.setMaxWeights(100);
+ _neutronizerChoice[NeutronHandlerType::partial_absorber] = 25;
+ _neutronizerChoice[NeutronHandlerType::partial_enricher] = 25;
+ _neutronizerChoice[NeutronHandlerType::total_absorber] = 25;
+ _neutronizerChoice[NeutronHandlerType::total_enricher] = 25;
+ setNeutronHandlerTypeNames();
+ _neutronizerChoice.init();
+
+ if(!_rootChoice.is_consistent())
+ {
+ setValid(false);
+ std::cout << _rootChoice.inconsitencyMessage("sorted_associative_set_driver::setProfile()") << std::endl;
+ }
+
+ if(!_domainChoice.is_consistent())
+ {
+ setValid(false);
+ std::cout << _domainChoice.inconsitencyMessage("sorted_associative_set_driver::setProfile()") << std::endl;
+ }
+
+ if(!_codomainChoice.is_consistent())
+ {
+ setValid(false);
+ std::cout << _codomainChoice.inconsitencyMessage("sorted_associative_set_driver::setProfile()") << std::endl;
+ }
+
+ if(!_neutronizerChoice.is_consistent())
+ {
+ setValid(false);
+ std::cout << _neutronizerChoice.inconsitencyMessage("sorted_associative_set_driver::setProfile()") << std::endl;
+ }
+
+ }
+
+
+ algebra_validater* chooseValidater()
+ {
+ int rootChoice = _rootChoice.some();
+ int domainChoice = _domainChoice.some();
+ int codomainChoice = _codomainChoice.some();
+ int neutronizerChoice = _neutronizerChoice.some();
+
+ switch(rootChoice)
+ {
+ case RootType:: interval_set: return new sorted_associative_validater< interval_set<int>, itl::list<int> >;
+ case RootType::separate_interval_set: return new sorted_associative_validater<separate_interval_set<int>, itl::list<int> >;
+ case RootType:: split_interval_set: return new sorted_associative_validater< split_interval_set<int>, itl::list<int> >;
+ default: return choiceError(ITL_LOCATION("rootChoice:\n"), rootChoice, _rootChoice);
+ } //switch()
+
+ return NULL; //just to please the compiler ;)
+ }
+ };
+
+
+}} // namespace itl boost
+
+#endif // BOOST_VALIDATE_DRIVER_SORTED_ASSOCIATIVE_SET_DRIVER_HPP_JOFA_091126
Modified: sandbox/itl/boost/validate/gentor/randomgentor.hpp
==============================================================================
--- sandbox/itl/boost/validate/gentor/randomgentor.hpp (original)
+++ sandbox/itl/boost/validate/gentor/randomgentor.hpp 2009-11-30 05:18:48 EST (Mon, 30 Nov 2009)
@@ -62,6 +62,11 @@
class RandomGentor< std::pair<DomainT,CodomainT> > :
public std_pair_gentor<DomainT,CodomainT> {};
+
+ template <class DomainT>
+ class RandomGentor<itl::list<DomainT> > :
+ public SeqGentorT<itl::list<DomainT> > {};
+
#ifdef LAW_BASED_TEST_BOOST_POLYGON
// -------------------------------------------------------------------------
template <class DomainT>
@@ -69,10 +74,6 @@
public point_gentor<DomainT> {};
template <class PointT>
- class RandomGentor<itl::list<PointT> > :
- public polygon_gentor<itl::list<PointT> > {};
-
- template <class PointT>
class RandomGentor<itl::list<itl::list<PointT> > > :
public polygon_set_gentor<itl::list<itl::list<PointT> > > {};
#endif //LAW_BASED_TEST_BOOST_POLYGON
@@ -94,10 +95,6 @@
class RandomGentor<itl::list<itl::interval<DomainT> > > :
public SeqGentorT<itl::list<itl::interval<DomainT> > > {};
- template <class DomainT>
- class RandomGentor<itl::list<DomainT> > :
- public SeqGentorT<itl::list<DomainT> > {};
-
// ----- sets --------------------------------------------------------------
//template <class DomainT, template<class>class Set>
//class RandomGentor<Set<DomainT> > :
Added: sandbox/itl/boost/validate/laws/atomic_equivalence.hpp
==============================================================================
--- (empty file)
+++ sandbox/itl/boost/validate/laws/atomic_equivalence.hpp 2009-11-30 05:18:48 EST (Mon, 30 Nov 2009)
@@ -0,0 +1,199 @@
+/*-----------------------------------------------------------------------------+
+A Law Based Test Automaton 'LaBatea'
+Author: Joachim Faulhaber
+Copyright (c) 2009-2009: Joachim Faulhaber
++------------------------------------------------------------------------------+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENCE.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
++-----------------------------------------------------------------------------*/
+#ifndef BOOST_VALIDATE_LAWS_ATOMIC_EQUIVALENCE_HPP_JOFA_091124
+#define BOOST_VALIDATE_LAWS_ATOMIC_EQUIVALENCE_HPP_JOFA_091124
+
+#include <boost/itl/type_traits/value_size.hpp>
+#include <boost/itl/functors.hpp>
+#include <boost/itl/predicates.hpp>
+#include <boost/itl/interval_morphism.hpp>
+#include <boost/validate/laws/law.hpp>
+#include <boost/validate/std/algorithm/copy.hpp>
+#include <boost/validate/std/algorithm/set_algo.hpp>
+
+namespace boost{namespace itl
+{
+
+// -----------------------------------------------------------------------------
+// S: Segment container
+// f: Atomize function transforming an interval container into an element container
+// E: Element container
+// g: A function (specifically std::algorithm) applicable to S and E
+// T: Target container
+//
+// S
+// / \
+// f / \ g
+// / = \
+// V V
+// E ------> T
+// g
+// -----------------------------------------------------------------------------
+template <typename SegmentsT,
+ typename TargetsT = typename SegmentsT::atomized_type,
+ template<class,class,template<class>class>class Algorithm = itl::std_copy_forward,
+ template<class>class TargetIterator = std::insert_iterator,
+ template<class,class>class Atomizer = itl::Interval::Atomize,
+ template<class>class Equality = itl::std_equal >
+class UnaryAtomicEquivalence :
+ public Law<UnaryAtomicEquivalence<SegmentsT, TargetsT,
+ Algorithm, TargetIterator,
+ Atomizer, Equality>,
+ LOKI_TYPELIST_1(SegmentsT),
+ LOKI_TYPELIST_2(TargetsT,TargetsT) >
+{
+ /** S: SegmentsT, T: TargetsT, I: InputIterator
+ Alg<S,T,I>: an algortihm on interval containers S
+ that results in a container T via iterator I.
+ For all S a: Alg<E,T,I>(atomize(a)) == Alg<S,T,I>(a)
+ Input = (a := inVal1)
+ Output = (lhs_result, rhs_result)
+ */
+public:
+ typedef typename SegmentsT::atomized_type ElementsT;
+
+ std::string name()const { return "UnnaryAtomicEquivalence"; }
+ std::string formula()const { return "For all S a: Alg<E,T,I>(atomize(a)) == Alg<S,T,I>(a)"; }
+
+ std::string typeString()const
+ {
+ return
+ "EleEq<"
+ + type_to_string<SegmentsT>::apply()+","
+ + type_to_string<TargetsT>::apply() +","
+ + Algorithm<ElementsT,TargetsT,TargetIterator>::struct_abbreviation() +">";
+ }
+
+public:
+
+ bool holds()
+ {
+ // For all S a: Alg<E,T,I>(atomize(a)) == Alg<S,T,I>(a)
+ // --- left hand side --------------------------------------------------
+ TargetsT lhs;
+ SegmentsT segmental_a = this->template getInputValue<operand_a>();
+ ElementsT elemental_a;
+ Atomizer<ElementsT,SegmentsT>()(elemental_a, segmental_a);
+ Algorithm<ElementsT,TargetsT,TargetIterator>::apply(elemental_a, lhs);
+
+ // --- right hand side -------------------------------------------------
+ TargetsT rhs;
+ Algorithm<SegmentsT,TargetsT,TargetIterator>::apply_elemental(segmental_a, rhs);
+
+ this->template setOutputValue<lhs_result>(lhs);
+ this->template setOutputValue<rhs_result>(rhs);
+
+ return Equality<TargetsT>()(lhs, rhs);
+ }
+
+ bool debug_holds()
+ {
+ return holds();
+ }
+
+ size_t size()const
+ {
+ return value_size<SegmentsT>::apply(this->template getInputValue<operand_a>());
+ }
+};
+
+
+
+// -----------------------------------------------------------------------------
+// S: Segment container
+// f: Atomize function transforming an interval container into an element container
+// E: Element container
+// .o.: U x U -> T A binary function (specifically std::algorithm) applicable to S or E
+// T: Target container
+//
+// S
+// / \
+// f / \ o
+// / = \
+// V V
+// E ------> T
+// o
+// -----------------------------------------------------------------------------
+template <typename SegmentsT,
+ typename TargetsT = typename SegmentsT::atomized_type,
+ template<class,class,template<class>class>class Algorithm = itl::std_set_union_forward,
+ template<class>class TargetIterator = std::insert_iterator,
+ template<class,class>class Atomizer = itl::Interval::Atomize,
+ template<class>class Equality = itl::std_equal >
+class BinaryAtomicEquivalence :
+ public Law<BinaryAtomicEquivalence<SegmentsT, TargetsT,
+ Algorithm, TargetIterator,
+ Atomizer, Equality>,
+ LOKI_TYPELIST_2(SegmentsT,SegmentsT),
+ LOKI_TYPELIST_2(TargetsT,TargetsT) >
+{
+ /** S: SegmentsT, T: TargetsT, I: InputIterator
+ Alg<S,T,I>: an algortihm on interval containers S
+ that results in a container T via iterator I.
+ For all S a,b: Alg<S,T,I>(atomize(a), atomize(b)) == Alg<S,T,I>(a,b)
+ Input = (a := inVal1)
+ Output = (lhs_result, rhs_result)
+ */
+public:
+ typedef typename SegmentsT::atomized_type ElementsT;
+
+ std::string name()const { return "BinaryAtomicEquivalence"; }
+ std::string formula()const
+ { return "For all S a: Alg<E,T,I>(f(a),f(b)) == Alg<S,T,I>(a,b)"; }
+
+ std::string typeString()const
+ {
+ return
+ "EleEq<"
+ + type_to_string<SegmentsT>::apply()+","
+ + type_to_string<TargetsT>::apply() +","
+ + Algorithm<ElementsT,TargetsT,TargetIterator>::struct_abbreviation() +">";
+ }
+
+public:
+
+ bool holds()
+ {
+ // For all S a: Alg<E,T,I>(atomize(a)) == Alg<S,T,I>(a)
+ // --- left hand side --------------------------------------------------
+ TargetsT lhs;
+ SegmentsT segmental_a = this->template getInputValue<operand_a>();
+ SegmentsT segmental_b = this->template getInputValue<operand_b>();
+ ElementsT elemental_a, elemental_b;
+ Atomizer<ElementsT,SegmentsT>()(elemental_a, segmental_a);
+ Atomizer<ElementsT,SegmentsT>()(elemental_b, segmental_b);
+ Algorithm<ElementsT,TargetsT,TargetIterator>::apply(elemental_a, elemental_b, lhs);
+
+ // --- right hand side -------------------------------------------------
+ TargetsT rhs;
+ Algorithm<SegmentsT,TargetsT,TargetIterator>::apply_elemental(segmental_a, segmental_b, rhs);
+
+ this->template setOutputValue<lhs_result>(lhs);
+ this->template setOutputValue<rhs_result>(rhs);
+
+ return Equality<TargetsT>()(lhs, rhs);
+ }
+
+ bool debug_holds()
+ {
+ return holds();
+ }
+
+ size_t size()const
+ {
+ return value_size<SegmentsT>::apply(this->template getInputValue<operand_a>())
+ + value_size<SegmentsT>::apply(this->template getInputValue<operand_b>());
+ }
+};
+
+}} // namespace itl boost
+
+#endif BOOST_VALIDATE_LAWS_ATOMIC_EQUIVALENCE_HPP_JOFA_091124
+
Modified: sandbox/itl/boost/validate/laws/function_equality.hpp
==============================================================================
--- sandbox/itl/boost/validate/laws/function_equality.hpp (original)
+++ sandbox/itl/boost/validate/laws/function_equality.hpp 2009-11-30 05:18:48 EST (Mon, 30 Nov 2009)
@@ -102,5 +102,5 @@
}} // namespace itl boost
-#endif // BOOST_ITL_MINOR_SET_LAWS_HPP_JOFA_070411
+#endif // BOOST_ITL_FUNCTION_EQUALITY_HPP_JOFA_091005
Modified: sandbox/itl/boost/validate/validater/law_validater.hpp
==============================================================================
--- sandbox/itl/boost/validate/validater/law_validater.hpp (original)
+++ sandbox/itl/boost/validate/validater/law_validater.hpp 2009-11-30 05:18:48 EST (Mon, 30 Nov 2009)
@@ -146,8 +146,15 @@
bool law_is_violated = false;
start = posix_time::ptime(posix_time::microsec_clock::local_time());
// In order to measure small time intervals, evaluation must be repeated.
- for(int repeat=0; repeat<_repeat_count; repeat++)
- law_is_violated = !_law.holds();
+
+ //std::cout << idx << " "; //CL..
+ //if(idx==0)
+ //{
+ // int dbg_ = 1;
+ //}
+
+ for(int repeat=0; repeat<_repeat_count; repeat++)
+ law_is_violated = !_law.holds();
stop = posix_time::ptime(posix_time::microsec_clock::local_time());
validation_time += static_cast<double>((stop - start).total_microseconds());
Added: sandbox/itl/boost/validate/validater/sorted_associative_validater.hpp
==============================================================================
--- (empty file)
+++ sandbox/itl/boost/validate/validater/sorted_associative_validater.hpp 2009-11-30 05:18:48 EST (Mon, 30 Nov 2009)
@@ -0,0 +1,128 @@
+/*-----------------------------------------------------------------------------+
+A Law Based Test Automaton 'LaBatea'
+Author: Joachim Faulhaber
+Copyright (c) 2007-2009: Joachim Faulhaber
++------------------------------------------------------------------------------+
+ Distributed under the Boost Software License, Version 1.0.
+ (See accompanying file LICENCE.txt or copy at
+ http://www.boost.org/LICENSE_1_0.txt)
++-----------------------------------------------------------------------------*/
+#ifndef BOOST_VALIDATE_VALIDATER_SORTED_ASSOCIATIVE_VALIDATER_HPP_JOFA_091125
+#define BOOST_VALIDATE_VALIDATER_SORTED_ASSOCIATIVE_VALIDATER_HPP_JOFA_091125
+
+#include <boost/validate/laws/atomic_equivalence.hpp>
+#include <boost/validate/validater/law_validater.hpp>
+#include <boost/validate/validater/algebra_validater.hpp>
+
+namespace boost{namespace itl
+{
+
+typedef WeightedNumberGentor<int> ChoiceT;
+
+template <typename Type, typename TargetT = itl::list<typename Type::value_type> >
+class sorted_associative_validater : public algebra_validater
+{
+public:
+
+ enum Laws
+ {
+ copy_fore ,
+ copy_back ,
+ reverse_copy_fore ,
+ reverse_copy_back ,
+ includes_fore ,
+ includes_back ,
+ set_union_fore ,
+ set_union_back ,
+ set_difference_fore,
+ set_difference_back,
+ set_intersection_fore,
+ set_intersection_back,
+ set_symmetric_difference_fore,
+ set_symmetric_difference_back,
+ Laws_size
+ };
+
+ sorted_associative_validater() {setProfile();}
+
+ void setProfile()
+ {
+ const int sum_of_shares = 100;
+
+ _lawChoice.setSize(Laws_size);
+ _lawChoice.setMaxWeights(sum_of_shares);
+
+ int rest_shares = sum_of_shares, item_index = 0;
+ _lawChoice[copy_fore ] = share(Laws_size, item_index, rest_shares);
+ _lawChoice[copy_back ] = share(Laws_size, item_index, rest_shares);
+ _lawChoice[reverse_copy_fore ] = share(Laws_size, item_index, rest_shares);
+ _lawChoice[reverse_copy_back ] = share(Laws_size, item_index, rest_shares);
+ _lawChoice[includes_fore ] = share(Laws_size, item_index, rest_shares);
+ _lawChoice[includes_back ] = share(Laws_size, item_index, rest_shares);
+ _lawChoice[set_union_fore ] = share(Laws_size, item_index, rest_shares);
+ _lawChoice[set_union_back ] = share(Laws_size, item_index, rest_shares);
+ _lawChoice[set_difference_fore ] = share(Laws_size, item_index, rest_shares);
+ _lawChoice[set_difference_back ] = share(Laws_size, item_index, rest_shares);
+ _lawChoice[set_intersection_fore ] = share(Laws_size, item_index, rest_shares);
+ _lawChoice[set_intersection_back ] = share(Laws_size, item_index, rest_shares);
+ _lawChoice[set_symmetric_difference_fore] = share(Laws_size, item_index, rest_shares);
+ _lawChoice[set_symmetric_difference_back] = share(Laws_size, item_index, rest_shares);
+
+ _lawChoice.init();
+ }
+
+
+ LawValidaterI* chooseValidater()
+ {
+ switch(_lawChoice.some())
+ {
+ case copy_fore : return new LawValidater< UnaryAtomicEquivalence<Type, TargetT, std_copy_forward >, RandomGentor>;
+ case copy_back : return new LawValidater< UnaryAtomicEquivalence<Type, TargetT, std_copy_backward >, RandomGentor>;
+ case reverse_copy_fore : return new LawValidater< UnaryAtomicEquivalence<Type, TargetT, std_reverse_copy_forward >, RandomGentor>;
+ case reverse_copy_back : return new LawValidater< UnaryAtomicEquivalence<Type, TargetT, std_reverse_copy_backward >, RandomGentor>;
+ case includes_fore : return new LawValidater<BinaryAtomicEquivalence<Type, TargetT, std_includes_forward >, RandomGentor>;
+ case includes_back : return new LawValidater<BinaryAtomicEquivalence<Type, TargetT, std_includes_backward >, RandomGentor>;
+ case set_union_fore : return new LawValidater<BinaryAtomicEquivalence<Type, TargetT, std_set_union_forward >, RandomGentor>;
+ case set_union_back : return new LawValidater<BinaryAtomicEquivalence<Type, TargetT, std_set_union_backward >, RandomGentor>;
+ case set_difference_fore: return new LawValidater<BinaryAtomicEquivalence<Type, TargetT, std_set_difference_forward >, RandomGentor>;
+ case set_difference_back: return new LawValidater<BinaryAtomicEquivalence<Type, TargetT, std_set_difference_backward>, RandomGentor>;
+ case set_intersection_fore: return new LawValidater<BinaryAtomicEquivalence<Type, TargetT, std_set_intersection_forward >, RandomGentor>;
+ case set_intersection_back: return new LawValidater<BinaryAtomicEquivalence<Type, TargetT, std_set_intersection_backward>, RandomGentor>;
+ case set_symmetric_difference_fore: return new LawValidater<BinaryAtomicEquivalence<Type, TargetT, std_set_symmetric_difference_forward >, RandomGentor>;
+ case set_symmetric_difference_back: return new LawValidater<BinaryAtomicEquivalence<Type, TargetT, std_set_symmetric_difference_backward>, RandomGentor>;
+ default: return NULL;
+ }
+ }
+
+ void validate()
+ {
+ _validater = chooseValidater();
+ if(_validater)
+ {
+ _validater->run();
+ _validater->addFrequencies(_frequencies);
+ _validater->addViolations(_violationsCount, _violations);
+ delete _validater;
+ }
+ }
+
+ void addFrequencies(ValidationCounterT& summary) { summary += _frequencies; }
+ void addViolations(ViolationCounterT& summary, ViolationMapT& collector)
+ {
+ summary += _violationsCount;
+ collector += _violations;
+ }
+
+
+private:
+ ChoiceT _lawChoice;
+ LawValidaterI* _validater;
+ ValidationCounterT _frequencies;
+ ViolationCounterT _violationsCount;
+ ViolationMapT _violations;
+};
+
+
+}} // namespace itl boost
+
+#endif // BOOST_VALIDATE_VALIDATER_SORTED_ASSOCIATIVE_VALIDATER_HPP_JOFA_091125
Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk