I just want to point out that this exists.  Normally if you cast from
a base type to a derived type, you should use dynamic_cast, but that's
a waste in many cases since there should be no other way it could have
happened.  (For example the param structs).  This is a nice handy
thing that will assert in debug mode, but do a static_cast otherwise.

  Nate

On Mon, Nov 10, 2008 at 6:49 PM, Nathan Binkert <[EMAIL PROTECTED]> wrote:
> changeset 83cc5483a8da in /z/repo/m5
> details: http://repo.m5sim.org/m5?cmd=changeset;node=83cc5483a8da
> description:
>        safe_cast: add a new cast function for casts that should always 
> succeed.
>        In DEBUG mode, this does a dynamic_cast and asserts that the result is
>        non null.  Otherwise, it just does a static_cast.  Again, this is only
>        intended for cases where the cast should always succeed and what's
>        desired is a debugging check to make sure.
>
> diffstat:
>
> 1 file changed, 34 insertions(+)
> src/base/cast.hh |   34 ++++++++++++++++++++++++++++++++++
>
> diffs (72 lines):
>
> diff -r 1a24f9a28729 -r 83cc5483a8da src/base/cast.hh
> --- /dev/null   Thu Jan 01 00:00:00 1970 +0000
> +++ b/src/base/cast.hh  Mon Nov 10 11:51:17 2008 -0800
> @@ -0,0 +1,68 @@
> +/*
> + * Copyright (c) 2008 The Hewlett-Packard Development Company
> + * All rights reserved.
> + *
> + * Redistribution and use in source and binary forms, with or without
> + * modification, are permitted provided that the following conditions are
> + * met: redistributions of source code must retain the above copyright
> + * notice, this list of conditions and the following disclaimer;
> + * redistributions in binary form must reproduce the above copyright
> + * notice, this list of conditions and the following disclaimer in the
> + * documentation and/or other materials provided with the distribution;
> + * neither the name of the copyright holders nor the names of its
> + * contributors may be used to endorse or promote products derived from
> + * this software without specific prior written permission.
> + *
> + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
> + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
> + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
> + * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
> + * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
> + * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
> + * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
> + * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
> + * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
> + * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
> + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
> + *
> + * Authors: Nathan Binkert
> + */
> +
> +#ifndef __BASE_CAST_HH__
> +#define __BASE_CAST_HH__
> +
> +#include <cassert>
> +
> +// This is designed for situations where we have a pointer to a base
> +// type, but in all cases when we cast it to a derived type, we know
> +// by construction that it should work correctly.
> +
> +#if defined(DEBUG)
> +
> +// In debug builds, do the dynamic cast and assert the result is good
> +
> +template <class T, class U>
> +inline T
> +safe_cast(U ptr)
> +{
> +    T ret = dynamic_cast<T>(ptr);
> +    assert(ret);
> +    return ret;
> +}
> +
> +#else
> +
> +// In non debug builds statically cast the result to the pointer we
> +// want to use.  This is technically unsafe, but this is only for
> +// cases where we know that this should work by construction.
> +
> +template <class T, class U>
> +inline T
> +safe_cast(U ptr)
> +{
> +    return static_cast<T>(ptr);
> +}
> +
> +#endif
> +
> +#endif // __BASE_CAST_HH__
> _______________________________________________
> m5-dev mailing list
> m5-dev@m5sim.org
> http://m5sim.org/mailman/listinfo/m5-dev
>
>
_______________________________________________
m5-dev mailing list
m5-dev@m5sim.org
http://m5sim.org/mailman/listinfo/m5-dev

Reply via email to