| // Copyright 2019 The Chromium Authors | 
 | // Use of this source code is governed by a BSD-style license that can be | 
 | // found in the LICENSE file. | 
 |  | 
 | #include "chrome/browser/android/profile_key_startup_accessor.h" | 
 |  | 
 | #include <type_traits> | 
 |  | 
 | #include "base/check.h" | 
 | #include "base/no_destructor.h" | 
 |  | 
 | ProfileKeyStartupAccessor::ProfileKeyStartupAccessor() : key_(nullptr) {} | 
 |  | 
 | // Hack to satisfy the compiler: ProfileKeyStartupAccessor's raw_ptr member | 
 | // may or may not be trivially destructible. If it isn't we have to use | 
 | // NoDestructor; if it is, we must not use NoDestructor. We use constexpr if | 
 | // to choose which to do, but the compiler will complain about the unused | 
 | // branch unless it's inside of a template, which is why this function exists. | 
 | template <typename T> | 
 | T* GetInstanceTemplated() { | 
 |   if constexpr (std::is_trivially_destructible_v<T>) { | 
 |     static T instance; | 
 |     return &instance; | 
 |   } else { | 
 |     static base::NoDestructor<T> instance; | 
 |     return instance.get(); | 
 |   } | 
 | } | 
 |  | 
 | // static | 
 | ProfileKeyStartupAccessor* ProfileKeyStartupAccessor::GetInstance() { | 
 |   return GetInstanceTemplated<ProfileKeyStartupAccessor>(); | 
 | } | 
 |  | 
 | void ProfileKeyStartupAccessor::SetProfileKey(ProfileKey* key) { | 
 |   DCHECK(!key_); | 
 |   key_ = key; | 
 | } | 
 |  | 
 | void ProfileKeyStartupAccessor::Reset() { | 
 |   key_ = nullptr; | 
 | } |