00001 /* Depends: A generic dependency tracker in C++ 00002 * Copyright (c) 2004-2007, Ronald Landheer-Cieslak 00003 * All rights reserved 00004 * 00005 * This is free software. You may distribute it and/or modify it and 00006 * distribute modified forms provided that the following terms are met: 00007 * 00008 * * Redistributions of the source code must retain the above copyright 00009 * notice, this list of conditions and the following disclaimer; 00010 * * Redistributions in binary form must reproduce the above copyright 00011 * notice, this list of conditions and the following disclaimer in 00012 * the documentation and/or other materials provided with the distribution; 00013 * * None of the names of the authors of this software may be used to endorse 00014 * or promote this software, derived software or any distribution of this 00015 * software or any distribution of which this software is part, without 00016 * prior written permission from the authors involved; 00017 * * Unless you have received a written statement from Ronald Landheer-Cieslak 00018 * that says otherwise, the terms of the GNU General Public License, as 00019 * published by the Free Software Foundation, version 2 or (at your option) 00020 * any later version, also apply. 00021 * 00022 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" 00023 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 00024 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 00025 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE 00026 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 00027 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 00028 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 00029 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 00030 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 00031 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE 00032 * POSSIBILITY OF SUCH DAMAGE. 00033 */ 00036 #ifndef _depends_details_scopedflag_h 00037 #define _depends_details_scopedflag_h 00038 00039 namespace Depends 00040 { 00041 namespace Details 00042 { 00044 template <class NodeType, typename FlagType = unsigned int> 00045 struct ScopedFlag 00046 { 00047 ScopedFlag(NodeType * node, FlagType flag) 00048 : node_(node), 00049 flag_(flag) 00050 { 00051 node->flags_ |= flag; 00052 } 00053 00054 ~ScopedFlag() 00055 { 00056 node_->flags_ ^= flag_; 00057 node_->flags_ &= ~flag_; 00058 } 00059 00060 NodeType * node_; 00061 FlagType flag_; 00062 }; 00063 } 00064 } 00065 00066 #endif 00067