Something went wrong. Try again.
This repository has no description
Something went wrong. Try again.
4.6 kB · 182 lines
C++
at develop
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183/* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- *//* * Main authors: * Christian Schulte <schulte@gecode.org> * * Copyright: * Christian Schulte, 2010 * * 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. * */
namespace Gecode { namespace Iter { namespace Values {
/** * \brief Iterator over value lists * * \ingroup FuncIterVlues */ class ValueListIter { protected: /// Value list class class ValueList : public Support::BlockClient<ValueList,Region> { public: /// Value int val; /// Next element ValueList* next; }; /// Shared object for allocation class VLIO : public Support::BlockAllocator<ValueList,Region> { public: /// Counter used for reference counting unsigned int use_cnt; /// Initialize VLIO(Region& r); }; /// Reference to shared object VLIO* vlio; /// Head of value list ValueList* h; /// Current list element ValueList* c; /// Set value lists void set(ValueList* l); public: /// \name Constructors and initialization //@{ /// Default constructor ValueListIter(void); /// Copy constructor ValueListIter(const ValueListIter& i); /// Initialize ValueListIter(Region& r); /// Initialize void init(Region& r); /// Assignment operator (both iterators must be allocated from the same region) ValueListIter& operator =(const ValueListIter& i); //@}
/// \name Iteration control //@{ /// Test whether iterator is still at a value or done bool operator ()(void) const; /// Move iterator to next value (if possible) void operator ++(void); /// Reset iterator to start void reset(void); //@}
/// \name Value access //@{ /// Return value int val(void) const; //@}
/// Destructor ~ValueListIter(void); };
forceinline ValueListIter::VLIO::VLIO(Region& r) : Support::BlockAllocator<ValueList,Region>(r), use_cnt(1) {}
forceinline ValueListIter::ValueListIter(void) : vlio(nullptr) {}
forceinline ValueListIter::ValueListIter(Region& r) : vlio(new (r.ralloc(sizeof(VLIO))) VLIO(r)), h(nullptr), c(nullptr) {}
forceinline void ValueListIter::init(Region& r) { vlio = new (r.ralloc(sizeof(VLIO))) VLIO(r); h = c = nullptr; }
forceinline ValueListIter::ValueListIter(const ValueListIter& i) : vlio(i.vlio), h(i.h), c(i.c) { vlio->use_cnt++; }
forceinline ValueListIter& ValueListIter::operator =(const ValueListIter& i) { if (&i != this) { if (--vlio->use_cnt == 0) { Region& r = vlio->allocator(); vlio->~VLIO(); r.rfree(vlio,sizeof(VLIO)); } vlio = i.vlio; vlio->use_cnt++; c=i.c; h=i.h; } return *this; }
forceinline ValueListIter::~ValueListIter(void) { if (--vlio->use_cnt == 0) { Region& r = vlio->allocator(); vlio->~VLIO(); r.rfree(vlio,sizeof(VLIO)); } }
forceinline void ValueListIter::set(ValueList* l) { h = c = l; }
forceinline bool ValueListIter::operator ()(void) const { return c != nullptr; }
forceinline void ValueListIter::operator ++(void) { c = c->next; }
forceinline void ValueListIter::reset(void) { c = h; }
forceinline int ValueListIter::val(void) const { return c->val; }
}}}
// STATISTICS: iter-any