bitset-offset.hpp
Go to the documentation of this file.
/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
/*
* Main authors:
* Christopher Mears <chris.mears@monash.edu>
*
* Contributing authors:
* Mikael Lagerkvist <lagerkvist@gecode.org>
* Christian Schulte <schulte@gecode.org>
*
* Copyright:
* Mikael Lagerkvist, 2007
* Christopher Mears, 2012
* Christian Schulte, 2007
*
* This file is part of Gecode, the generic constraint
* development environment:
* http://www.gecode.org
*
* Permission is hereby granted, free of charge, to any person obtaining
* a copy of this software and associated documentation files (the
* "Software"), to deal in the Software without restriction, including
* without limitation the rights to use, copy, modify, merge, publish,
* distribute, sublicense, and/or sell copies of the Software, and to
* permit persons to whom the Software is furnished to do so, subject to
* the following conditions:
*
* The above copyright notice and this permission notice shall be
* included in all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
* LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
* OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
* WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*
*/
#include <climits>
#include <cmath>
#include <iostream>
namespace Gecode { namespace Support {
template<class A>
class BitSetOffset : public BitSetBase {
protected:
A& a;
int _offset;
public:
BitSetOffset(A& a, unsigned int s, int o);
BitSetOffset(A& a, const BitSetOffset& bs);
~BitSetOffset(void);
// As for the ordinary bitset, most operations can be inherited
// directly from BitSetBase. We only modify the operations that
// involve indices or the offset itself.
bool get(int i) const;
void set(int i);
void clear(int i);
int next(int i) const;
void resize(A& a, unsigned int n, int offset, bool set=false);
int offset(void) const;
int max_bit(void) const;
bool valid(int i) const;
};
template<class A>
forceinline
BitSetOffset<A>::BitSetOffset(A& a0, unsigned int s, int o)
: BitSetBase(a0,s), a(a0), _offset(o) {}
template<class A>
forceinline
BitSetOffset<A>::BitSetOffset(A& a0, const BitSetOffset<A>& bs)
: BitSetBase(a0,bs), a(a0), _offset(bs._offset) {}
template<class A>
forceinline
BitSetOffset<A>::~BitSetOffset(void) {
dispose(a);
}
template<class A>
forceinline bool
BitSetOffset<A>::get(int i) const { return BitSetBase::get(i-_offset); }
template<class A>
forceinline void
BitSetOffset<A>::set(int i) { BitSetBase::set(i-_offset); }
template<class A>
forceinline void
BitSetOffset<A>::clear(int i) { BitSetBase::clear(i-_offset); }
template<class A>
forceinline int
BitSetOffset<A>::next(int i) const { return _offset + BitSetBase::next(i-_offset); }
template<class A>
void
BitSetOffset<A>::resize(A& a, unsigned int n, int offset, bool set) {
BitSetBase::resize(a, n, set);
_offset = offset;
}
template<class A>
forceinline int
BitSetOffset<A>::offset(void) const { return _offset; }
template<class A>
forceinline int
BitSetOffset<A>::max_bit(void) const { return _offset + size() - 1; }
template<class A>
forceinline bool
BitSetOffset<A>::valid(int i) const { return _offset <= i && i <= _offset + (int)size() - 1; }
template <class A, class Char, class Traits>
std::basic_ostream<Char,Traits>&
operator <<(std::basic_ostream<Char,Traits>& os, const BitSetOffset<A>& bs) {
for (int i = bs.offset() ; i < bs.offset()+static_cast<int>(bs.size()) ; i++)
if (bs.get(i))
os << i << " ";
return os;
}
}}
// STATISTICS: support-any
Gecode::Support::BitSetBase::dispose
void dispose(A &a)
Dispose memory for bit set.
Definition bitset-base.hpp:548
Gecode::Support::BitSetBase::get
bool get(unsigned int i) const
Access value at bit i.
Definition bitset-base.hpp:590
Gecode::Support::BitSetBase::size
unsigned int size(void) const
Return size of bitset (number of bits).
Definition bitset-base.hpp:585
Gecode::Support::BitSetBase::clear
void clear(unsigned int i)
Clear bit i.
Definition bitset-base.hpp:600
Gecode::Support::BitSetBase::set
void set(unsigned int i)
Set bit i.
Definition bitset-base.hpp:595
Gecode::Support::BitSetBase::next
unsigned int next(unsigned int i) const
Return position greater or equal i of next set bit (i is allowed to be equal to size).
Definition bitset-base.hpp:606
Gecode::Support::BitSetBase::resize
void resize(A &a, unsigned int n, bool setbits=false)
Resize bitset to n elememts.
Definition bitset-base.hpp:542
Gecode::Support::BitSetOffset
Bitsets with index offset.
Definition bitset-offset.hpp:51
Gecode::Support::BitSetOffset::~BitSetOffset
~BitSetOffset(void)
Destructor.
Definition bitset-offset.hpp:100
Gecode::Support::BitSetOffset::get
bool get(int i) const
Access value at bit i.
Definition bitset-offset.hpp:106
Gecode::Support::BitSetOffset::next
int next(int i) const
Return position greater or equal i of next set bit (i is allowed to be equal to size).
Definition bitset-offset.hpp:118
Gecode::Support::BitSetOffset< Gecode::Space >::offset
int offset(void) const
Definition bitset-offset.hpp:129
Gecode::Support::BitSetOffset::valid
bool valid(int i) const
Is the bit index valid for this bitset?
Definition bitset-offset.hpp:137
Gecode::Support::BitSetOffset::max_bit
int max_bit(void) const
Retrieve the maximum valid index.
Definition bitset-offset.hpp:133
Gecode::Support::BitSetOffset::resize
void resize(A &a, unsigned int n, int offset, bool set=false)
Resize bitset to n elements with specified offset.
Definition bitset-offset.hpp:122
Gecode::Support::BitSetOffset::set
void set(int i)
Set bit i.
Definition bitset-offset.hpp:110
Gecode::Support::BitSetOffset::a
A & a
Allocator.
Definition bitset-offset.hpp:54
Gecode::Support::BitSetOffset::clear
void clear(int i)
Clear bit i.
Definition bitset-offset.hpp:114
Gecode::Support::BitSetOffset::BitSetOffset
BitSetOffset(A &a, unsigned int s, int o)
Bit set with space for s bits with offset of \o.
Definition bitset-offset.hpp:90
Gecode::Support::BitSetOffset::_offset
int _offset
Offset.
Definition bitset-offset.hpp:56
Gecode::Support
Support algorithms and datastructures
Gecode::Support::operator<<
std::basic_ostream< Char, Traits > & operator<<(std::basic_ostream< Char, Traits > &os, const BitSetOffset< A > &bs)
Definition bitset-offset.hpp:141
Gecode
Gecode toplevel namespace
forceinline
#define forceinline
Definition config.hpp:187