diff -r d8475431bbbb -r 8e85e6bbefdf lemon/utility.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/lemon/utility.h Mon May 23 04:48:14 2005 +0000 @@ -0,0 +1,152 @@ +/* -*- C++ -*- + * lemon/utility.h - Part of LEMON, a generic C++ optimization library + * + * Copyright (C) 2005 Egervary Jeno Kombinatorikus Optimalizalasi + * Kutatocsoport (Egervary Research Group on Combinatorial Optimization, + * EGRES). + * + * Permission to use, modify and distribute this software is granted + * provided that this copyright notice appears in all copies. For + * precise terms see the accompanying LICENSE file. + * + * This software is provided "AS IS" with no warranty of any kind, + * express or implied, and with no claim as to its suitability for any + * purpose. + * + * This file contains a modified version of the enable_if library from BOOST. + * See the appropriate copyright notice below. + */ + +// Boost enable_if library + +// Copyright 2003 © The Trustees of Indiana University. + +// Use, modification, and distribution is subject to the Boost Software +// License, Version 1.0. (See accompanying file LICENSE_1_0.txt or copy at +// http://www.boost.org/LICENSE_1_0.txt) + +// Authors: Jaakko Järvi (jajarvi at osl.iu.edu) +// Jeremiah Willcock (jewillco at osl.iu.edu) +// Andrew Lumsdaine (lums at osl.iu.edu) + + +#ifndef LEMON_UTILITY_H +#define LEMON_UTILITY_H + +namespace lemon +{ + + /// Basic type for defining "tags". A "YES" condition for enable_if. + + /// \todo This should go to a separate "basic_types.h" (or something) + /// file. + struct True { + static const bool value = true; + }; + + /// Basic type for defining "tags". A "NO" condition for enable_if. + struct False { + static const bool value = false; + }; + + template + struct Wrap { + const T &value; + Wrap(const T &t) : value(t) {} + }; + + /**************** dummy class to avoid ambiguity ****************/ + + template struct dummy { dummy(int) {} }; + + /**************** enable_if from BOOST ****************/ + + template + struct enable_if_c { + typedef T type; + }; + + template + struct enable_if_c {}; + + template + struct enable_if : public enable_if_c {}; + + template + struct lazy_enable_if_c { + typedef typename T::type type; + }; + + template + struct lazy_enable_if_c {}; + + template + struct lazy_enable_if : public lazy_enable_if_c {}; + + + template + struct disable_if_c { + typedef T type; + }; + + template + struct disable_if_c {}; + + template + struct disable_if : public disable_if_c {}; + + template + struct lazy_disable_if_c { + typedef typename T::type type; + }; + + template + struct lazy_disable_if_c {}; + + template + struct lazy_disable_if : public lazy_disable_if_c {}; + + // smart referencing + + template + struct SmartReference { + typedef _Type& Type; + }; + + template + struct SmartReference< + _Type, + typename enable_if::type + > { + typedef _Type Type; + }; + + template + struct SmartConstReference { + typedef const _Type& Type; + }; + + template + struct SmartConstReference< + _Type, + typename enable_if::type + > { + typedef const _Type Type; + }; + + template + struct SmartParameter { + typedef _Type& Type; + }; + + template + struct SmartParameter< + _Type, + typename enable_if::type + > { + typedef const _Type& Type; + }; + +} // namespace lemon + +#endif