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