sym-obj.cpp
Go to the documentation of this file.00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */ 00002 /* 00003 * Main authors: 00004 * Christopher Mears <chris.mears@monash.edu> 00005 * 00006 * Copyright: 00007 * Christopher Mears, 2012 00008 * 00009 * This file is part of Gecode, the generic constraint 00010 * development environment: 00011 * http://www.gecode.org 00012 * 00013 * Permission is hereby granted, free of charge, to any person obtaining 00014 * a copy of this software and associated documentation files (the 00015 * "Software"), to deal in the Software without restriction, including 00016 * without limitation the rights to use, copy, modify, merge, publish, 00017 * distribute, sublicense, and/or sell copies of the Software, and to 00018 * permit persons to whom the Software is furnished to do so, subject to 00019 * the following conditions: 00020 * 00021 * The above copyright notice and this permission notice shall be 00022 * included in all copies or substantial portions of the Software. 00023 * 00024 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, 00025 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF 00026 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND 00027 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE 00028 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION 00029 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION 00030 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 00031 * 00032 */ 00033 00034 #include <gecode/int/ldsb.hh> 00035 00036 namespace Gecode { 00037 SymmetryHandle::SymmetryHandle(void) 00038 : ref(NULL) {} 00039 SymmetryHandle::SymmetryHandle(Int::LDSB::SymmetryObject* o) 00040 : ref(o) {} 00041 SymmetryHandle::SymmetryHandle(const SymmetryHandle& h) 00042 : ref(h.ref) { 00043 if (ref != NULL) 00044 increment(); 00045 } 00046 const SymmetryHandle& 00047 SymmetryHandle::operator=(const SymmetryHandle& h) { 00048 if (h.ref == ref) 00049 return *this; 00050 if (ref != NULL) 00051 decrement(); 00052 ref = h.ref; 00053 if (ref != NULL) 00054 increment(); 00055 return *this; 00056 } 00057 SymmetryHandle::~SymmetryHandle(void) { 00058 if (ref != NULL) 00059 decrement(); 00060 } 00061 void 00062 SymmetryHandle::increment(void) { 00063 (ref->nrefs)++; 00064 } 00065 void 00066 SymmetryHandle::decrement(void) { 00067 (ref->nrefs)--; 00068 if (ref->nrefs == 0) 00069 delete ref; 00070 ref = NULL; 00071 } 00072 } 00073 00074 namespace Gecode { namespace Int { namespace LDSB { 00075 00076 SymmetryObject::SymmetryObject(void) 00077 : nrefs(1) {} 00078 SymmetryObject::~SymmetryObject(void) {} 00079 00080 VariableSymmetryObject::VariableSymmetryObject(ArgArray<VarImpBase*> vars) { 00081 nxs = vars.size(); 00082 xs = new VarImpBase*[nxs]; 00083 for (int i = 0 ; i < nxs ; i++) 00084 xs[i] = vars[i]; 00085 } 00086 VariableSymmetryObject::~VariableSymmetryObject(void) { 00087 delete [] xs; 00088 } 00089 00090 ValueSymmetryObject::ValueSymmetryObject(IntSet vs) 00091 : values(vs) {} 00092 00093 VariableSequenceSymmetryObject:: 00094 VariableSequenceSymmetryObject(ArgArray<VarImpBase*> x, int ss) 00095 : seq_size(ss) { 00096 nxs = x.size(); 00097 xs = new VarImpBase*[nxs]; 00098 for (int i = 0 ; i < nxs ; i++) 00099 xs[i] = x[i]; 00100 } 00101 VariableSequenceSymmetryObject::~VariableSequenceSymmetryObject(void) { 00102 delete [] xs; 00103 } 00104 00105 ValueSequenceSymmetryObject::ValueSequenceSymmetryObject(IntArgs vs, int ss) 00106 : values(vs), seq_size(ss) {} 00107 00108 }}} 00109 00110 // STATISTICS: int-branch