Generated on Mon Nov 30 23:53:19 2009 for Gecode by doxygen 1.6.1

node.hpp

Go to the documentation of this file.
00001 /* -*- mode: C++; c-basic-offset: 2; indent-tabs-mode: nil -*- */
00002 /*
00003  *  Main authors:
00004  *     Guido Tack <tack@gecode.org>
00005  *
00006  *  Copyright:
00007  *     Guido Tack, 2006
00008  *
00009  *  Last modified:
00010  *     $Date: 2009-01-21 11:36:29 +0100 (Wed, 21 Jan 2009) $ by $Author: schulte $
00011  *     $Revision: 8083 $
00012  *
00013  *  This file is part of Gecode, the generic constraint
00014  *  development environment:
00015  *     http://www.gecode.org
00016  *
00017  * Permission is hereby granted, free of charge, to any person obtaining
00018  * a copy of this software and associated documentation files (the
00019  * "Software"), to deal in the Software without restriction, including
00020  * without limitation the rights to use, copy, modify, merge, publish,
00021  * distribute, sublicense, and/or sell copies of the Software, and to
00022  * permit persons to whom the Software is furnished to do so, subject to
00023  * the following conditions:
00024  *
00025  * The above copyright notice and this permission notice shall be
00026  * included in all copies or substantial portions of the Software.
00027  *
00028  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
00029  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
00030  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
00031  * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
00032  * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
00033  * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
00034  * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
00035  *
00036  */
00037 
00038 namespace Gecode { namespace Gist {
00039 
00040   forceinline unsigned int
00041   Node::getTag(void) const {
00042     return static_cast<unsigned int>
00043       (reinterpret_cast<ptrdiff_t>(childrenOrFirstChild) & 3);
00044   }
00045 
00046   forceinline void
00047   Node::setTag(unsigned int tag) {
00048     assert(tag <= 3);
00049     assert(getTag() == UNDET);
00050     childrenOrFirstChild = reinterpret_cast<void*>
00051       ( (reinterpret_cast<ptrdiff_t>(childrenOrFirstChild) & ~(3)) | tag);
00052   }
00053 
00054   forceinline void*
00055   Node::getPtr(void) const {
00056     return reinterpret_cast<void*>
00057       (reinterpret_cast<ptrdiff_t>(childrenOrFirstChild) & ~(3));
00058   }
00059 
00060   forceinline
00061   Node::Node(void) : parent(NULL) {
00062     childrenOrFirstChild = NULL;
00063     c.secondChild = NULL;
00064     setTag(UNDET);
00065   }
00066 
00067   forceinline Node*
00068   Node::getParent(void) { return parent; }
00069 
00070   forceinline bool
00071   Node::isUndetermined(void) const { return getTag() == UNDET; }
00072 
00073   forceinline Node*
00074   Node::getChild(unsigned int n) {
00075     assert(getTag() != UNDET && getTag() != LEAF);
00076     if (getTag() == TWO_CHILDREN) {
00077       assert(n != 1 || Support::marked(c.secondChild));
00078       return n == 0 ? static_cast<Node*>(getPtr()) :
00079         static_cast<Node*>(Support::unmark(c.secondChild));
00080     }
00081     assert(n < c.noOfChildren);
00082     return static_cast<Node**>(getPtr())[n];
00083   }
00084 
00085   forceinline bool
00086   Node::isRoot(void) const { return parent == NULL; }
00087 
00088   forceinline unsigned int
00089   Node::getNumberOfChildren(void) const {
00090     switch (getTag()) {
00091     case UNDET: return 0;
00092     case LEAF:  return 0;
00093     case TWO_CHILDREN: return 1+Support::marked(c.secondChild);
00094     default: return c.noOfChildren;
00095     }
00096   }
00097 
00098 }}
00099 
00100 // STATISTICS: gist-any