Stroika Library 3.0d16
 
Loading...
Searching...
No Matches
Cast.h File Reference
#include "Stroika/Foundation/StroikaPreComp.h"
#include <memory>
#include "Stroika/Foundation/Debug/Assertions.h"
#include "Cast.inl"

Go to the source code of this file.

Namespaces

namespace  Stroika::Foundation
 

Functions

template<typename T , typename T1 >
Stroika::Foundation::Debug::UncheckedDynamicCast (T1 &&arg) noexcept
 return the same value as dynamic_cast<T> would have, except instead of checking nullptr, only check in DEBUG builds, and there ASSERT != null (if original pointer not null)
 
template<typename T , typename T1 >
std::shared_ptr< T > Stroika::Foundation::Debug::UncheckedDynamicPointerCast (const std::shared_ptr< T1 > &arg) noexcept
 Produce the same result as dynamic_pointer_cast if the successful case (non-null) - with better performance.
 

Function Documentation

◆ UncheckedDynamicCast()

template<typename T , typename T1 >
T Stroika::Foundation::Debug::UncheckedDynamicCast ( T1 &&  arg)
noexcept

return the same value as dynamic_cast<T> would have, except instead of checking nullptr, only check in DEBUG builds, and there ASSERT != null (if original pointer not null)

Precondition
arg != nullptr

Use where you would want to check Assert (dynamic_cast<const T*> (&ir) != nullptr) and then do static_cast<> instead;)

AssertMember (&ir, IteratorRep_);
auto&   mir = static_cast<const IteratorRep_&> (ir);

The purpose of this function is to gain the performance of static_cast<> but the safety / checking of dynamic_cast (in debug builds).

Example Usage
auto& mir = Debug::UncheckedDynamicCast<const IteratorRep_&> (i.ConstGetRep ());
Example Usage
virtual bool Equals (const IRep* rhs) const override
{
RequireMember (rhs, MyIterRep_);
const MyIterRep_* rrhs = Debug::UncheckedDynamicCast<const MyIterRep_*> (rhs);
return fData_.data () == rrhs->fData_.data () and fIdx_ == rrhs->fIdx_;
}
#define RequireMember(p, c)
Definition Assertions.h:326
#define RequireNotNull(p)
Definition Assertions.h:347
See also
https://stackoverflow.com/questions/28002/regular-cast-vs-static-cast-vs-dynamic-cast
Note
this does NOT work (should be checked somehow/assert/type info

Definition at line 13 of file Cast.inl.

◆ UncheckedDynamicPointerCast()

template<typename T , typename T1 >
std::shared_ptr< T > Stroika::Foundation::Debug::UncheckedDynamicPointerCast ( const std::shared_ptr< T1 > &  arg)
noexcept

Produce the same result as dynamic_pointer_cast if the successful case (non-null) - with better performance.

Precondition
arg != nullptr
dynamic_pointer_cast<T> (arg) != nullptr
See also
UncheckedDynamicCast and dynamic_pointer_cast

Definition at line 42 of file Cast.inl.