Commit 69e54672 authored by Yedidya Feldblum's avatar Yedidya Feldblum Committed by Facebook Github Bot

type_info_of

Summary: [Folly] `type_info_of`, which returns `typeid` when RTTI is available, otherwise `nullptr`.

Reviewed By: swolchok

Differential Revision: D14159675

fbshipit-source-id: b64ab770f12c7385bb286f658627d085e561def6
parent 12314eb7
......@@ -24,6 +24,7 @@
#include <folly/Likely.h>
#include <folly/detail/Singleton.h>
#include <folly/lang/Exception.h>
#include <folly/lang/TypeInfo.h>
namespace folly {
namespace detail {
......@@ -75,12 +76,12 @@ class StaticSingletonManagerWithRtti {
}
template <typename T, typename Tag>
FOLLY_ALWAYS_INLINE static std::type_info const& key_() {
#if FOLLY_HAS_RTTI
return typeid(TypeTuple<T, Tag>);
#else
FOLLY_ALWAYS_INLINE static Key const& key_() {
auto const key = type_info_of<TypeTuple<T, Tag>>();
if (!key) {
throw_exception<std::logic_error>("rtti unavailable");
#endif
}
return *key;
}
FOLLY_NOINLINE static void* create_(Key const& key, Make& make, Cache& cache);
......
/*
* Copyright 2019-present Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#pragma once
#include <typeinfo>
#include <folly/Portability.h>
namespace folly {
// type_info_of
//
// Returns &typeid(T) if RTTI is available, nullptr otherwise.
//
// This overload works on the static type of the template parameter.
template <typename T>
FOLLY_ALWAYS_INLINE static std::type_info const* type_info_of() {
#if FOLLY_HAS_RTTI
return &typeid(T);
#else
return nullptr;
#endif
}
// type_info_of
//
// Returns &typeid(t) if RTTI is available, nullptr otherwise.
//
// This overload works on the dynamic type of the non-template parameter.
template <typename T>
FOLLY_ALWAYS_INLINE static std::type_info const* type_info_of(T const& t) {
#if FOLLY_HAS_RTTI
return &typeid(t);
#else
return nullptr;
#endif
}
} // namespace folly
/*
* Copyright 2019-present Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include <folly/lang/TypeInfo.h>
#include <folly/portability/GTest.h>
class TypeInfoTest : public testing::Test {};
namespace std {
static void PrintTo(type_info const& ti, std::ostream* out) {
*out << ti.name();
}
} // namespace std
namespace {
struct Foo {};
struct Bar : Foo {
virtual ~Bar() {}
};
struct Toc : Bar {};
} // namespace
TEST_F(TypeInfoTest, exanples) {
EXPECT_EQ(typeid(Foo), *folly::type_info_of<Foo>());
EXPECT_EQ(typeid(Foo), *folly::type_info_of(Foo()));
EXPECT_EQ(typeid(Foo), *folly::type_info_of(static_cast<Foo const&>(Bar())));
EXPECT_EQ(typeid(Bar), *folly::type_info_of(static_cast<Bar const&>(Bar())));
EXPECT_EQ(typeid(Toc), *folly::type_info_of(static_cast<Bar const&>(Toc())));
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment