int-set.icc
Go to the documentation of this file.00001 /* 00002 * Main authors: 00003 * Christian Schulte <schulte@gecode.org> 00004 * 00005 * Copyright: 00006 * Christian Schulte, 2003 00007 * 00008 * Last modified: 00009 * $Date: 2006-08-04 16:03:26 +0200 (Fri, 04 Aug 2006) $ by $Author: schulte $ 00010 * $Revision: 3512 $ 00011 * 00012 * This file is part of Gecode, the generic constraint 00013 * development environment: 00014 * http://www.gecode.org 00015 * 00016 * See the file "LICENSE" for information on usage and 00017 * redistribution of this file, and for a 00018 * DISCLAIMER OF ALL WARRANTIES. 00019 * 00020 */ 00021 00022 namespace Gecode { 00023 00024 /* 00025 * Integer sets 00026 * 00027 */ 00028 00029 forceinline 00030 IntSet::IntSet(void) {} 00031 00032 forceinline 00033 IntSet::IntSet(const IntSet& s) : sar(s.sar) {} 00034 00035 template <class I> 00036 forceinline 00037 IntSet::IntSet(I& i) { 00038 int j=0; 00039 while (i()) { 00040 sar.ensure(j+1); 00041 sar[j].min = i.min(); sar[j].max = i.max(); 00042 ++j; ++i; 00043 } 00044 sar.size(j); 00045 } 00046 00047 forceinline 00048 IntSet::IntSet(const int r[][2], int n) : sar(n) { init(r,n); } 00049 00050 forceinline 00051 IntSet::IntSet(const int r[], int n) : sar(n) { init(r,n); } 00052 00053 forceinline 00054 IntSet::IntSet(int n, int m) : sar(1) { init(n,m); } 00055 00056 forceinline void 00057 IntSet::update(bool share, IntSet& s) { 00058 sar.update(share, s.sar); 00059 } 00060 00061 forceinline int 00062 IntSet::min(int i) const { 00063 return sar[i].min; 00064 } 00065 00066 forceinline int 00067 IntSet::max(int i) const { 00068 return sar[i].max; 00069 } 00070 00071 forceinline unsigned int 00072 IntSet::width(int i) const { 00073 return sar[i].max-sar[i].min+1; 00074 } 00075 00076 forceinline int 00077 IntSet::size(void) const { 00078 return sar.size(); 00079 } 00080 00081 forceinline int 00082 IntSet::min(void) const { 00083 return sar[0].min; 00084 } 00085 00086 forceinline int 00087 IntSet::max(void) const { 00088 return sar[sar.size()-1].max; 00089 } 00090 00091 00092 /* 00093 * Range iterator for integer sets 00094 * 00095 */ 00096 00097 forceinline 00098 IntSetRanges::IntSetRanges(void) {} 00099 forceinline 00100 IntSetRanges::IntSetRanges(const IntSet& s) 00101 : i(&s.sar[0]), e(&s.sar[s.size()]) {} 00102 forceinline void 00103 IntSetRanges::init(const IntSet& s) { 00104 i = &s.sar[0]; e = &s.sar[s.size()]; 00105 } 00106 00107 forceinline void 00108 IntSetRanges::operator++(void) { 00109 i++; 00110 } 00111 forceinline bool 00112 IntSetRanges::operator()(void) const { 00113 return i<e; 00114 } 00115 00116 forceinline int 00117 IntSetRanges::min(void) const { 00118 return i->min; 00119 } 00120 forceinline int 00121 IntSetRanges::max(void) const { 00122 return i->max; 00123 } 00124 forceinline unsigned int 00125 IntSetRanges::width(void) const { 00126 return i->max - i->min +1; 00127 } 00128 00129 /* 00130 * Value iterator for integer sets 00131 * 00132 */ 00133 forceinline 00134 IntSetValues::IntSetValues(void) {} 00135 00136 forceinline 00137 IntSetValues::IntSetValues(const IntSet& s) { 00138 IntSetRanges r(s); 00139 Iter::Ranges::ToValues<IntSetRanges>::init(r); 00140 } 00141 00142 forceinline void 00143 IntSetValues::init(const IntSet& s) { 00144 IntSetRanges r(s); 00145 Iter::Ranges::ToValues<IntSetRanges>::init(r); 00146 } 00147 00148 } 00149 00150 // STATISTICS: int-var 00151