Changes imported from Abseil "staging" branch:
- 0320844dcd8219965647f86db7c6c7296e40e41e Introduce internal macros for inline variable emulation s... by Matt Calabrese <calabrese@google.com> - 85197d0105805e6aab3a0a648351cb1582a61be0 Internal change. by Alex Strelnikov <strel@google.com> GitOrigin-RevId: 0320844dcd8219965647f86db7c6c7296e40e41e Change-Id: I7dce37f6839ff099462951059a9047c5c9377638
This commit is contained in:
		
							parent
							
								
									dcf112f074
								
							
						
					
					
						commit
						cf1db73d2a
					
				
					 10 changed files with 285 additions and 11 deletions
				
			
		| 
						 | 
					@ -128,6 +128,7 @@ cc_library(
 | 
				
			||||||
    name = "base_internal",
 | 
					    name = "base_internal",
 | 
				
			||||||
    hdrs = [
 | 
					    hdrs = [
 | 
				
			||||||
        "internal/identity.h",
 | 
					        "internal/identity.h",
 | 
				
			||||||
 | 
					        "internal/inline_variable.h",
 | 
				
			||||||
        "internal/invoke.h",
 | 
					        "internal/invoke.h",
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
    copts = ABSL_DEFAULT_COPTS,
 | 
					    copts = ABSL_DEFAULT_COPTS,
 | 
				
			||||||
| 
						 | 
					@ -257,6 +258,22 @@ cc_test(
 | 
				
			||||||
    ],
 | 
					    ],
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					cc_test(
 | 
				
			||||||
 | 
					    name = "inline_variable_test",
 | 
				
			||||||
 | 
					    size = "small",
 | 
				
			||||||
 | 
					    srcs = [
 | 
				
			||||||
 | 
					        "inline_variable_test.cc",
 | 
				
			||||||
 | 
					        "inline_variable_test_a.cc",
 | 
				
			||||||
 | 
					        "inline_variable_test_b.cc",
 | 
				
			||||||
 | 
					        "internal/inline_variable_testing.h",
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					    copts = ABSL_TEST_COPTS,
 | 
				
			||||||
 | 
					    deps = [
 | 
				
			||||||
 | 
					        ":base_internal",
 | 
				
			||||||
 | 
					        "@com_google_googletest//:gtest_main",
 | 
				
			||||||
 | 
					    ],
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cc_test(
 | 
					cc_test(
 | 
				
			||||||
    name = "invoke_test",
 | 
					    name = "invoke_test",
 | 
				
			||||||
    size = "small",
 | 
					    size = "small",
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -37,6 +37,7 @@ list(APPEND BASE_INTERNAL_HEADERS
 | 
				
			||||||
  "internal/exception_safety_testing.h"
 | 
					  "internal/exception_safety_testing.h"
 | 
				
			||||||
  "internal/identity.h"
 | 
					  "internal/identity.h"
 | 
				
			||||||
  "internal/invoke.h"
 | 
					  "internal/invoke.h"
 | 
				
			||||||
 | 
					  "internal/inline_variable.h"
 | 
				
			||||||
  "internal/low_level_alloc.h"
 | 
					  "internal/low_level_alloc.h"
 | 
				
			||||||
  "internal/low_level_scheduling.h"
 | 
					  "internal/low_level_scheduling.h"
 | 
				
			||||||
  "internal/malloc_extension.h"
 | 
					  "internal/malloc_extension.h"
 | 
				
			||||||
| 
						 | 
					@ -214,6 +215,26 @@ absl_test(
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					# test inline_variable_test
 | 
				
			||||||
 | 
					list(APPEND INLINE_VARIABLE_TEST_SRC
 | 
				
			||||||
 | 
					  "internal/inline_variable_testing.h"
 | 
				
			||||||
 | 
					  "inline_variable_test.cc"
 | 
				
			||||||
 | 
					  "inline_variable_test_a.cc"
 | 
				
			||||||
 | 
					  "inline_variable_test_b.cc"
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					set(INLINE_VARIABLE_TEST_PUBLIC_LIBRARIES absl::base)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					absl_test(
 | 
				
			||||||
 | 
					  TARGET
 | 
				
			||||||
 | 
					    inline_variable_test
 | 
				
			||||||
 | 
					  SOURCES
 | 
				
			||||||
 | 
					    ${INLINE_VARIABLE_TEST_SRC}
 | 
				
			||||||
 | 
					  PUBLIC_LIBRARIES
 | 
				
			||||||
 | 
					    ${INLINE_VARIABLE_TEST_PUBLIC_LIBRARIES}
 | 
				
			||||||
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# test spinlock_test_common
 | 
					# test spinlock_test_common
 | 
				
			||||||
set(SPINLOCK_TEST_COMMON_SRC "spinlock_test_common.cc")
 | 
					set(SPINLOCK_TEST_COMMON_SRC "spinlock_test_common.cc")
 | 
				
			||||||
set(SPINLOCK_TEST_COMMON_PUBLIC_LIBRARIES absl::base absl::synchronization)
 | 
					set(SPINLOCK_TEST_COMMON_PUBLIC_LIBRARIES absl::base absl::synchronization)
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
							
								
								
									
										62
									
								
								absl/base/inline_variable_test.cc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										62
									
								
								absl/base/inline_variable_test.cc
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,62 @@
 | 
				
			||||||
 | 
					// Copyright 2017 The Abseil Authors.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// 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 <type_traits>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "absl/base/internal/inline_variable.h"
 | 
				
			||||||
 | 
					#include "absl/base/internal/inline_variable_testing.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "gtest/gtest.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace absl {
 | 
				
			||||||
 | 
					namespace inline_variable_testing_internal {
 | 
				
			||||||
 | 
					namespace {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEST(InlineVariableTest, Constexpr) {
 | 
				
			||||||
 | 
					  static_assert(inline_variable_foo.value == 5, "");
 | 
				
			||||||
 | 
					  static_assert(other_inline_variable_foo.value == 5, "");
 | 
				
			||||||
 | 
					  static_assert(inline_variable_int == 5, "");
 | 
				
			||||||
 | 
					  static_assert(other_inline_variable_int == 5, "");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEST(InlineVariableTest, DefaultConstructedIdentityEquality) {
 | 
				
			||||||
 | 
					  EXPECT_EQ(get_foo_a().value, 5);
 | 
				
			||||||
 | 
					  EXPECT_EQ(get_foo_b().value, 5);
 | 
				
			||||||
 | 
					  EXPECT_EQ(&get_foo_a(), &get_foo_b());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEST(InlineVariableTest, DefaultConstructedIdentityInequality) {
 | 
				
			||||||
 | 
					  EXPECT_NE(&inline_variable_foo, &other_inline_variable_foo);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEST(InlineVariableTest, InitializedIdentityEquality) {
 | 
				
			||||||
 | 
					  EXPECT_EQ(get_int_a(), 5);
 | 
				
			||||||
 | 
					  EXPECT_EQ(get_int_b(), 5);
 | 
				
			||||||
 | 
					  EXPECT_EQ(&get_int_a(), &get_int_b());
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEST(InlineVariableTest, InitializedIdentityInequality) {
 | 
				
			||||||
 | 
					  EXPECT_NE(&inline_variable_int, &other_inline_variable_int);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					TEST(InlineVariableTest, FunPtrType) {
 | 
				
			||||||
 | 
					  static_assert(
 | 
				
			||||||
 | 
					      std::is_same<void(*)(),
 | 
				
			||||||
 | 
					                   std::decay<decltype(inline_variable_fun_ptr)>::type>::value,
 | 
				
			||||||
 | 
					      "");
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}  // namespace
 | 
				
			||||||
 | 
					}  // namespace inline_variable_testing_internal
 | 
				
			||||||
 | 
					}  // namespace absl
 | 
				
			||||||
| 
						 | 
					@ -12,16 +12,14 @@
 | 
				
			||||||
// See the License for the specific language governing permissions and
 | 
					// See the License for the specific language governing permissions and
 | 
				
			||||||
// limitations under the License.
 | 
					// limitations under the License.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
// -----------------------------------------------------------------------------
 | 
					#include "absl/base/internal/inline_variable_testing.h"
 | 
				
			||||||
// File: ascii.h
 | 
					 | 
				
			||||||
// -----------------------------------------------------------------------------
 | 
					 | 
				
			||||||
//
 | 
					 | 
				
			||||||
#include "absl/utility/utility.h"
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace absl {
 | 
					namespace absl {
 | 
				
			||||||
 | 
					namespace inline_variable_testing_internal {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#ifndef ABSL_HAVE_STD_OPTIONAL
 | 
					const Foo& get_foo_a() { return inline_variable_foo; }
 | 
				
			||||||
const in_place_t in_place{};
 | 
					 | 
				
			||||||
#endif
 | 
					 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const int& get_int_a() { return inline_variable_int; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}  // namespace inline_variable_testing_internal
 | 
				
			||||||
}  // namespace absl
 | 
					}  // namespace absl
 | 
				
			||||||
							
								
								
									
										25
									
								
								absl/base/inline_variable_test_b.cc
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								absl/base/inline_variable_test_b.cc
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,25 @@
 | 
				
			||||||
 | 
					// Copyright 2017 The Abseil Authors.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// 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 "absl/base/internal/inline_variable_testing.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace absl {
 | 
				
			||||||
 | 
					namespace inline_variable_testing_internal {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Foo& get_foo_b() { return inline_variable_foo; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const int& get_int_b() { return inline_variable_int; }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}  // namespace inline_variable_testing_internal
 | 
				
			||||||
 | 
					}  // namespace absl
 | 
				
			||||||
							
								
								
									
										107
									
								
								absl/base/internal/inline_variable.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										107
									
								
								absl/base/internal/inline_variable.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,107 @@
 | 
				
			||||||
 | 
					// Copyright 2017 The Abseil Authors.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef ABSL_BASE_INTERNAL_INLINE_VARIABLE_EMULATION_H_
 | 
				
			||||||
 | 
					#define ABSL_BASE_INTERNAL_INLINE_VARIABLE_EMULATION_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include <type_traits>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "absl/base/internal/identity.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// File:
 | 
				
			||||||
 | 
					//   This file define a macro that allows the creation of or emulation of C++17
 | 
				
			||||||
 | 
					//   inline variables based on whether or not the feature is supported.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					// Macro: ABSL_INTERNAL_INLINE_CONSTEXPR(type, name, init)
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Description:
 | 
				
			||||||
 | 
					//   Expands to the equivalent of an inline constexpr instance of the specified
 | 
				
			||||||
 | 
					//   `type` and `name`, initialized to the value `init`. If the compiler being
 | 
				
			||||||
 | 
					//   used is detected as supporting actual inline variables as a language
 | 
				
			||||||
 | 
					//   feature, then the macro expands to an actual inline variable definition.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Requires:
 | 
				
			||||||
 | 
					//   `type` is a type that is usable in an extern variable declaration.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Requires: `name` is a valid identifier
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Requires:
 | 
				
			||||||
 | 
					//   `init` is an expression that can be used in the following definition:
 | 
				
			||||||
 | 
					//     constexpr type name = init;
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Usage:
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					//   // Equivalent to: `inline constexpr size_t variant_npos = -1;`
 | 
				
			||||||
 | 
					//   ABSL_INTERNAL_INLINE_CONSTEXPR(size_t, variant_npos, -1);
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Differences in implementation:
 | 
				
			||||||
 | 
					//   For a direct, language-level inline variable, decltype(name) will be the
 | 
				
			||||||
 | 
					//   type that was specified along with const qualification, whereas for
 | 
				
			||||||
 | 
					//   emulated inline variables, decltype(name) may be different (in practice
 | 
				
			||||||
 | 
					//   it will likely be a reference type).
 | 
				
			||||||
 | 
					////////////////////////////////////////////////////////////////////////////////
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef __cpp_inline_variables
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Clang's -Wmissing-variable-declarations option erroneously warned that
 | 
				
			||||||
 | 
					// inline constexpr objects need to be pre-declared. This has now been fixed,
 | 
				
			||||||
 | 
					// but we will need to support this workaround for people building with older
 | 
				
			||||||
 | 
					// versions of clang.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Bug: https://bugs.llvm.org/show_bug.cgi?id=35862
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Note:
 | 
				
			||||||
 | 
					//   identity_t is used here so that the const and name are in the
 | 
				
			||||||
 | 
					//   appropriate place for pointer types, reference types, function pointer
 | 
				
			||||||
 | 
					//   types, etc..
 | 
				
			||||||
 | 
					#if defined(__clang__)
 | 
				
			||||||
 | 
					#define ABSL_INTERNAL_EXTERN_DECL(type, name) \
 | 
				
			||||||
 | 
					  extern const ::absl::internal::identity_t<type> name;
 | 
				
			||||||
 | 
					#else  // Otherwise, just define the macro to do nothing.
 | 
				
			||||||
 | 
					#define ABSL_INTERNAL_EXTERN_DECL(type, name)
 | 
				
			||||||
 | 
					#endif  // defined(__clang__)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// See above comment at top of file for details.
 | 
				
			||||||
 | 
					#define ABSL_INTERNAL_INLINE_CONSTEXPR(type, name, init) \
 | 
				
			||||||
 | 
					  ABSL_INTERNAL_EXTERN_DECL(type, name)                  \
 | 
				
			||||||
 | 
					  inline constexpr ::absl::internal::identity_t<type> name = init
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// See above comment at top of file for details.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// Note:
 | 
				
			||||||
 | 
					//   identity_t is used here so that the const and name are in the
 | 
				
			||||||
 | 
					//   appropriate place for pointer types, reference types, function pointer
 | 
				
			||||||
 | 
					//   types, etc..
 | 
				
			||||||
 | 
					#define ABSL_INTERNAL_INLINE_CONSTEXPR(var_type, name, init)                  \
 | 
				
			||||||
 | 
					  template <class /*AbslInternalDummy*/ = void>                               \
 | 
				
			||||||
 | 
					  struct AbslInternalInlineVariableHolder##name {                             \
 | 
				
			||||||
 | 
					    static constexpr ::absl::internal::identity_t<var_type> kInstance = init; \
 | 
				
			||||||
 | 
					  };                                                                          \
 | 
				
			||||||
 | 
					                                                                              \
 | 
				
			||||||
 | 
					  template <class AbslInternalDummy>                                          \
 | 
				
			||||||
 | 
					  constexpr ::absl::internal::identity_t<var_type>                            \
 | 
				
			||||||
 | 
					      AbslInternalInlineVariableHolder##name<AbslInternalDummy>::kInstance;   \
 | 
				
			||||||
 | 
					                                                                              \
 | 
				
			||||||
 | 
					  static constexpr const ::absl::internal::identity_t<var_type>&              \
 | 
				
			||||||
 | 
					      name = /* NOLINT */                                                     \
 | 
				
			||||||
 | 
					      AbslInternalInlineVariableHolder##name<>::kInstance;                    \
 | 
				
			||||||
 | 
					  static_assert(sizeof(void (*)(decltype(name))) != 0,                        \
 | 
				
			||||||
 | 
					                "Silence unused variable warnings.")
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif  // __cpp_inline_variables
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif  // ABSL_BASE_INTERNAL_INLINE_VARIABLE_EMULATION_H_
 | 
				
			||||||
							
								
								
									
										44
									
								
								absl/base/internal/inline_variable_testing.h
									
										
									
									
									
										Normal file
									
								
							
							
						
						
									
										44
									
								
								absl/base/internal/inline_variable_testing.h
									
										
									
									
									
										Normal file
									
								
							| 
						 | 
					@ -0,0 +1,44 @@
 | 
				
			||||||
 | 
					// Copyright 2017 The Abseil Authors.
 | 
				
			||||||
 | 
					//
 | 
				
			||||||
 | 
					// 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.
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifndef ABSL_BASE_INLINE_VARIABLE_TESTING_H_
 | 
				
			||||||
 | 
					#define ABSL_BASE_INLINE_VARIABLE_TESTING_H_
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#include "absl/base/internal/inline_variable.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					namespace absl {
 | 
				
			||||||
 | 
					namespace inline_variable_testing_internal {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					struct Foo {
 | 
				
			||||||
 | 
					  int value = 5;
 | 
				
			||||||
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ABSL_INTERNAL_INLINE_CONSTEXPR(Foo, inline_variable_foo, {});
 | 
				
			||||||
 | 
					ABSL_INTERNAL_INLINE_CONSTEXPR(Foo, other_inline_variable_foo, {});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ABSL_INTERNAL_INLINE_CONSTEXPR(int, inline_variable_int, 5);
 | 
				
			||||||
 | 
					ABSL_INTERNAL_INLINE_CONSTEXPR(int, other_inline_variable_int, 5);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					ABSL_INTERNAL_INLINE_CONSTEXPR(void(*)(), inline_variable_fun_ptr, nullptr);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const Foo& get_foo_a();
 | 
				
			||||||
 | 
					const Foo& get_foo_b();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					const int& get_int_a();
 | 
				
			||||||
 | 
					const int& get_int_b();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					}  // namespace inline_variable_testing_internal
 | 
				
			||||||
 | 
					}  // namespace absl
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#endif  // ABSL_BASE_INLINE_VARIABLE_TESTING_H_
 | 
				
			||||||
| 
						 | 
					@ -10,7 +10,6 @@ licenses(["notice"])  # Apache 2.0
 | 
				
			||||||
 | 
					
 | 
				
			||||||
cc_library(
 | 
					cc_library(
 | 
				
			||||||
    name = "utility",
 | 
					    name = "utility",
 | 
				
			||||||
    srcs = ["utility.cc"],
 | 
					 | 
				
			||||||
    hdrs = ["utility.h"],
 | 
					    hdrs = ["utility.h"],
 | 
				
			||||||
    copts = ABSL_DEFAULT_COPTS,
 | 
					    copts = ABSL_DEFAULT_COPTS,
 | 
				
			||||||
    deps = [
 | 
					    deps = [
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -22,7 +22,6 @@ list(APPEND UTILITY_PUBLIC_HEADERS
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
list(APPEND UTILITY_SRC
 | 
					list(APPEND UTILITY_SRC
 | 
				
			||||||
  "utility.cc"
 | 
					 | 
				
			||||||
  ${UTILITY_PUBLIC_HEADERS}
 | 
					  ${UTILITY_PUBLIC_HEADERS}
 | 
				
			||||||
)
 | 
					)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -45,6 +45,7 @@
 | 
				
			||||||
#include <utility>
 | 
					#include <utility>
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#include "absl/base/config.h"
 | 
					#include "absl/base/config.h"
 | 
				
			||||||
 | 
					#include "absl/base/internal/inline_variable.h"
 | 
				
			||||||
#include "absl/base/internal/invoke.h"
 | 
					#include "absl/base/internal/invoke.h"
 | 
				
			||||||
#include "absl/meta/type_traits.h"
 | 
					#include "absl/meta/type_traits.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					@ -155,7 +156,8 @@ using std::in_place;
 | 
				
			||||||
// `absl::optional`, designed to be a drop-in replacement for C++17's
 | 
					// `absl::optional`, designed to be a drop-in replacement for C++17's
 | 
				
			||||||
// `std::in_place_t`.
 | 
					// `std::in_place_t`.
 | 
				
			||||||
struct in_place_t {};
 | 
					struct in_place_t {};
 | 
				
			||||||
extern const in_place_t in_place;
 | 
					
 | 
				
			||||||
 | 
					ABSL_INTERNAL_INLINE_CONSTEXPR(in_place_t, in_place, {});
 | 
				
			||||||
 | 
					
 | 
				
			||||||
#endif  // ABSL_HAVE_STD_OPTIONAL
 | 
					#endif  // ABSL_HAVE_STD_OPTIONAL
 | 
				
			||||||
 | 
					
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue