Use constexpr at namespace scope

This is essentially based on a search for “^const .*=”.

Change-Id: I9332c1f0cf7c891ba1ae373dc537f700f9a1d956
Reviewed-on: https://chromium-review.googlesource.com/585452
Reviewed-by: Leonard Mosescu <mosescu@chromium.org>
This commit is contained in:
Mark Mentovai 2017-07-25 14:31:27 -04:00
parent 6dac7ecdf5
commit 8f0636288a
27 changed files with 73 additions and 92 deletions

View File

@ -43,8 +43,8 @@ constexpr wchar_t kSettings[] = L"settings.dat";
constexpr wchar_t kCrashReportFileExtension[] = L"dmp"; constexpr wchar_t kCrashReportFileExtension[] = L"dmp";
const uint32_t kMetadataFileHeaderMagic = 'CPAD'; constexpr uint32_t kMetadataFileHeaderMagic = 'CPAD';
const uint32_t kMetadataFileVersion = 1; constexpr uint32_t kMetadataFileVersion = 1;
using OperationStatus = CrashReportDatabase::OperationStatus; using OperationStatus = CrashReportDatabase::OperationStatus;

View File

@ -16,7 +16,7 @@
namespace crashpad { namespace crashpad {
const uint32_t MinidumpModuleCrashpadInfo::kVersion; constexpr uint32_t MinidumpModuleCrashpadInfo::kVersion;
const uint32_t MinidumpCrashpadInfo::kVersion; constexpr uint32_t MinidumpCrashpadInfo::kVersion;
} // namespace crashpad } // namespace crashpad

View File

@ -290,7 +290,7 @@ struct ALIGNAS(4) PACKED MinidumpModuleCrashpadInfo {
//! \brief The structures currently-defined version number. //! \brief The structures currently-defined version number.
//! //!
//! \sa version //! \sa version
static const uint32_t kVersion = 1; static constexpr uint32_t kVersion = 1;
//! \brief The structures version number. //! \brief The structures version number.
//! //!
@ -387,7 +387,7 @@ struct ALIGNAS(4) PACKED MinidumpCrashpadInfo {
//! \brief The structures currently-defined version number. //! \brief The structures currently-defined version number.
//! //!
//! \sa version //! \sa version
static const uint32_t kVersion = 1; static constexpr uint32_t kVersion = 1;
//! \brief The structures version number. //! \brief The structures version number.
//! //!

View File

@ -35,7 +35,7 @@ namespace crashpad {
namespace test { namespace test {
namespace { namespace {
const MinidumpStreamType kBogusStreamType = constexpr MinidumpStreamType kBogusStreamType =
static_cast<MinidumpStreamType>(1234); static_cast<MinidumpStreamType>(1234);
// expected_streams is the expected number of streams in the file. The memory // expected_streams is the expected number of streams in the file. The memory

View File

@ -24,7 +24,7 @@
namespace { namespace {
const size_t kMaximumAlignment = 16; constexpr size_t kMaximumAlignment = 16;
} // namespace } // namespace
@ -82,7 +82,7 @@ void MinidumpWritable::RegisterLocationDescriptor(
registered_location_descriptors_.push_back(location_descriptor); registered_location_descriptors_.push_back(location_descriptor);
} }
const size_t MinidumpWritable::kInvalidSize = constexpr size_t MinidumpWritable::kInvalidSize =
std::numeric_limits<size_t>::max(); std::numeric_limits<size_t>::max();
MinidumpWritable::MinidumpWritable() MinidumpWritable::MinidumpWritable()

View File

@ -33,7 +33,7 @@
namespace { namespace {
const uint32_t kInvalidSegmentIndex = std::numeric_limits<uint32_t>::max(); constexpr uint32_t kInvalidSegmentIndex = std::numeric_limits<uint32_t>::max();
} // namespace } // namespace

View File

@ -47,16 +47,16 @@ namespace {
// are different. // are different.
#if defined(ARCH_CPU_64_BITS) #if defined(ARCH_CPU_64_BITS)
using MachHeader = mach_header_64; using MachHeader = mach_header_64;
const uint32_t kMachMagic = MH_MAGIC_64; constexpr uint32_t kMachMagic = MH_MAGIC_64;
using SegmentCommand = segment_command_64; using SegmentCommand = segment_command_64;
const uint32_t kSegmentCommand = LC_SEGMENT_64; constexpr uint32_t kSegmentCommand = LC_SEGMENT_64;
using Section = section_64; using Section = section_64;
using Nlist = nlist_64; using Nlist = nlist_64;
#else #else
using MachHeader = mach_header; using MachHeader = mach_header;
const uint32_t kMachMagic = MH_MAGIC; constexpr uint32_t kMachMagic = MH_MAGIC;
using SegmentCommand = segment_command; using SegmentCommand = segment_command;
const uint32_t kSegmentCommand = LC_SEGMENT; constexpr uint32_t kSegmentCommand = LC_SEGMENT;
using Section = section; using Section = section;
// This needs to be called “struct nlist” because “nlist” without the struct // This needs to be called “struct nlist” because “nlist” without the struct
@ -65,9 +65,9 @@ using Nlist = struct nlist;
#endif #endif
#if defined(ARCH_CPU_X86_64) #if defined(ARCH_CPU_X86_64)
const int kCPUType = CPU_TYPE_X86_64; constexpr int kCPUType = CPU_TYPE_X86_64;
#elif defined(ARCH_CPU_X86) #elif defined(ARCH_CPU_X86)
const int kCPUType = CPU_TYPE_X86; constexpr int kCPUType = CPU_TYPE_X86;
#endif #endif
// Verifies that |expect_section| and |actual_section| agree. // Verifies that |expect_section| and |actual_section| agree.
@ -327,7 +327,8 @@ void ExpectSegmentCommands(const MachHeader* expect_image,
// In some cases, the expected slide value for an image is unknown, because no // In some cases, the expected slide value for an image is unknown, because no
// reasonable API to return it is provided. When this happens, use kSlideUnknown // reasonable API to return it is provided. When this happens, use kSlideUnknown
// to avoid checking the actual slide value against anything. // to avoid checking the actual slide value against anything.
const mach_vm_size_t kSlideUnknown = std::numeric_limits<mach_vm_size_t>::max(); constexpr mach_vm_size_t kSlideUnknown =
std::numeric_limits<mach_vm_size_t>::max();
// Verifies that |expect_image| is a vaild Mach-O header for the current system // Verifies that |expect_image| is a vaild Mach-O header for the current system
// by checking its |magic| and |cputype| fields. Then, verifies that the // by checking its |magic| and |cputype| fields. Then, verifies that the

View File

@ -38,7 +38,7 @@ base::FilePath GenerateCandidateName() {
return system_temp_dir.Append(new_dir_name); return system_temp_dir.Append(new_dir_name);
} }
const int kRetries = 50; constexpr int kRetries = 50;
} // namespace } // namespace

View File

@ -45,11 +45,12 @@ using FileOffset = off_t;
//! \brief Scoped wrapper of a FileHandle. //! \brief Scoped wrapper of a FileHandle.
using ScopedFileHandle = base::ScopedFD; using ScopedFileHandle = base::ScopedFD;
//! \brief The return value of read and write calls.
using FileOperationResult = ssize_t;
//! \brief A value that can never be a valid FileHandle. //! \brief A value that can never be a valid FileHandle.
const FileHandle kInvalidFileHandle = -1; const FileHandle kInvalidFileHandle = -1;
using FileOperationResult = ssize_t;
#elif defined(OS_WIN) #elif defined(OS_WIN)
using FileHandle = HANDLE; using FileHandle = HANDLE;
@ -109,19 +110,28 @@ enum class StdioStream {
namespace internal { namespace internal {
#if defined(OS_POSIX) || DOXYGEN
//! \brief The name of the native read function used by ReadFile(). //! \brief The name of the native read function used by ReadFile().
//! //!
//! This value may be useful for logging. //! This value may be useful for logging.
//! //!
//! \sa kNativeWriteFunctionName //! \sa kNativeWriteFunctionName
extern const char kNativeReadFunctionName[]; constexpr char kNativeReadFunctionName[] = "read";
//! \brief The name of the native write function used by WriteFile(). //! \brief The name of the native write function used by WriteFile().
//! //!
//! This value may be useful for logging. //! This value may be useful for logging.
//! //!
//! \sa kNativeReadFunctionName //! \sa kNativeReadFunctionName
extern const char kNativeWriteFunctionName[]; constexpr char kNativeWriteFunctionName[] = "write";
#elif defined(OS_WIN)
constexpr char kNativeReadFunctionName[] = "ReadFile";
constexpr char kNativeWriteFunctionName[] = "WriteFile";
#endif
//! \brief The internal implementation of ReadFileExactly() and its wrappers. //! \brief The internal implementation of ReadFileExactly() and its wrappers.
//! //!

View File

@ -96,9 +96,6 @@ FileHandle OpenFileForOutput(int rdwr_or_wronly,
namespace internal { namespace internal {
const char kNativeReadFunctionName[] = "read";
const char kNativeWriteFunctionName[] = "write";
FileOperationResult NativeWriteFile(FileHandle file, FileOperationResult NativeWriteFile(FileHandle file,
const void* buffer, const void* buffer,
size_t size) { size_t size) {

View File

@ -84,9 +84,6 @@ FileHandle OpenFileForOutput(DWORD access,
namespace internal { namespace internal {
const char kNativeReadFunctionName[] = "ReadFile";
const char kNativeWriteFunctionName[] = "WriteFile";
FileOperationResult NativeWriteFile(FileHandle file, FileOperationResult NativeWriteFile(FileHandle file,
const void* buffer, const void* buffer,
size_t size) { size_t size) {

View File

@ -32,12 +32,12 @@ using testing::Return;
// Fake Mach ports. These arent used as ports in these tests, theyre just used // Fake Mach ports. These arent used as ports in these tests, theyre just used
// as cookies to make sure that the correct values get passed to the correct // as cookies to make sure that the correct values get passed to the correct
// places. // places.
const mach_port_t kServerLocalPort = 0x05050505; constexpr mach_port_t kServerLocalPort = 0x05050505;
const mach_port_t kCheckInPort = 0x06060606; constexpr mach_port_t kCheckInPort = 0x06060606;
// Other fake values. // Other fake values.
const mach_msg_type_name_t kCheckInPortRightType = MACH_MSG_TYPE_PORT_SEND; constexpr mach_msg_type_name_t kCheckInPortRightType = MACH_MSG_TYPE_PORT_SEND;
const child_port_token_t kCheckInToken = 0xfedcba9876543210; constexpr child_port_token_t kCheckInToken = 0xfedcba9876543210;
// The definition of the request structure from child_port.h isnt available // The definition of the request structure from child_port.h isnt available
// here. It needs custom initialization code, so duplicate the expected // here. It needs custom initialization code, so duplicate the expected

View File

@ -43,28 +43,28 @@ using testing::Return;
// Fake Mach ports. These arent used as ports in these tests, theyre just used // Fake Mach ports. These arent used as ports in these tests, theyre just used
// as cookies to make sure that the correct values get passed to the correct // as cookies to make sure that the correct values get passed to the correct
// places. // places.
const mach_port_t kClientRemotePort = 0x01010101; constexpr mach_port_t kClientRemotePort = 0x01010101;
const mach_port_t kServerLocalPort = 0x02020202; constexpr mach_port_t kServerLocalPort = 0x02020202;
const thread_t kExceptionThreadPort = 0x03030303; constexpr thread_t kExceptionThreadPort = 0x03030303;
const task_t kExceptionTaskPort = 0x04040404; constexpr task_t kExceptionTaskPort = 0x04040404;
// Other fake exception values. // Other fake exception values.
const exception_type_t kExceptionType = EXC_BAD_ACCESS; constexpr exception_type_t kExceptionType = EXC_BAD_ACCESS;
// Test using an exception code with the high bit set to ensure that it gets // Test using an exception code with the high bit set to ensure that it gets
// promoted to the wider mach_exception_data_type_t type as a signed quantity. // promoted to the wider mach_exception_data_type_t type as a signed quantity.
const exception_data_type_t kTestExceptonCodes[] = { constexpr exception_data_type_t kTestExceptonCodes[] = {
KERN_PROTECTION_FAILURE, KERN_PROTECTION_FAILURE,
implicit_cast<exception_data_type_t>(0xfedcba98), implicit_cast<exception_data_type_t>(0xfedcba98),
}; };
const mach_exception_data_type_t kTestMachExceptionCodes[] = { constexpr mach_exception_data_type_t kTestMachExceptionCodes[] = {
KERN_PROTECTION_FAILURE, KERN_PROTECTION_FAILURE,
implicit_cast<mach_exception_data_type_t>(0xfedcba9876543210), implicit_cast<mach_exception_data_type_t>(0xfedcba9876543210),
}; };
const thread_state_flavor_t kThreadStateFlavor = MACHINE_THREAD_STATE; constexpr thread_state_flavor_t kThreadStateFlavor = MACHINE_THREAD_STATE;
const mach_msg_type_number_t kThreadStateFlavorCount = constexpr mach_msg_type_number_t kThreadStateFlavorCount =
MACHINE_THREAD_STATE_COUNT; MACHINE_THREAD_STATE_COUNT;
void InitializeMachMsgPortDescriptor(mach_msg_port_descriptor_t* descriptor, void InitializeMachMsgPortDescriptor(mach_msg_port_descriptor_t* descriptor,

View File

@ -34,9 +34,9 @@ struct BootstrapCheckInTraits {
mach_port_t* service_port) { mach_port_t* service_port) {
return bootstrap_check_in(bootstrap_port, service_name, service_port); return bootstrap_check_in(bootstrap_port, service_name, service_port);
} }
static const char kName[]; static constexpr char kName[] = "bootstrap_check_in";
}; };
const char BootstrapCheckInTraits::kName[] = "bootstrap_check_in"; constexpr char BootstrapCheckInTraits::kName[];
struct BootstrapLookUpTraits { struct BootstrapLookUpTraits {
using Type = base::mac::ScopedMachSendRight; using Type = base::mac::ScopedMachSendRight;
@ -45,9 +45,9 @@ struct BootstrapLookUpTraits {
mach_port_t* service_port) { mach_port_t* service_port) {
return bootstrap_look_up(bootstrap_port, service_name, service_port); return bootstrap_look_up(bootstrap_port, service_name, service_port);
} }
static const char kName[]; static constexpr char kName[] = "bootstrap_look_up";
}; };
const char BootstrapLookUpTraits::kName[] = "bootstrap_look_up"; constexpr char BootstrapLookUpTraits::kName[];
template <typename Traits> template <typename Traits>
typename Traits::Type BootstrapCheckInOrLookUp( typename Traits::Type BootstrapCheckInOrLookUp(

View File

@ -30,7 +30,7 @@ namespace crashpad {
//! are not performed, use kMachPortNull instead of an explicit `implicit_cast` //! are not performed, use kMachPortNull instead of an explicit `implicit_cast`
//! of `MACH_PORT_NULL` to `mach_port_t`. This is useful for logging and testing //! of `MACH_PORT_NULL` to `mach_port_t`. This is useful for logging and testing
//! assertions. //! assertions.
const mach_port_t kMachPortNull = MACH_PORT_NULL; constexpr mach_port_t kMachPortNull = MACH_PORT_NULL;
//! \brief `MACH_EXCEPTION_CODES` with the correct type for a Mach exception //! \brief `MACH_EXCEPTION_CODES` with the correct type for a Mach exception
//! behavior, `exception_behavior_t`. //! behavior, `exception_behavior_t`.
@ -38,7 +38,7 @@ const mach_port_t kMachPortNull = MACH_PORT_NULL;
//! Signedness problems can occur when ORing `MACH_EXCEPTION_CODES` as a signed //! Signedness problems can occur when ORing `MACH_EXCEPTION_CODES` as a signed
//! integer, because a signed integer overflow results. This constant can be //! integer, because a signed integer overflow results. This constant can be
//! used instead of `MACH_EXCEPTION_CODES` in such cases. //! used instead of `MACH_EXCEPTION_CODES` in such cases.
const exception_behavior_t kMachExceptionCodes = MACH_EXCEPTION_CODES; constexpr exception_behavior_t kMachExceptionCodes = MACH_EXCEPTION_CODES;
// Because exception_mask_t is an int and has one bit for each defined // Because exception_mask_t is an int and has one bit for each defined
// exception_type_t, its reasonable to assume that there cannot be any // exception_type_t, its reasonable to assume that there cannot be any
@ -49,7 +49,7 @@ const exception_behavior_t kMachExceptionCodes = MACH_EXCEPTION_CODES;
// EXC_MASK_CRASH. // EXC_MASK_CRASH.
//! \brief An exception type to use for simulated exceptions. //! \brief An exception type to use for simulated exceptions.
const exception_type_t kMachExceptionSimulated = 'CPsx'; constexpr exception_type_t kMachExceptionSimulated = 'CPsx';
//! \brief A const version of `thread_state_t`. //! \brief A const version of `thread_state_t`.
//! //!

View File

@ -62,7 +62,7 @@ TEST(MachExtensions, NewMachPort_DeadName) {
EXPECT_EQ(type, MACH_PORT_TYPE_DEAD_NAME); EXPECT_EQ(type, MACH_PORT_TYPE_DEAD_NAME);
} }
const exception_mask_t kExcMaskBasic = constexpr exception_mask_t kExcMaskBasic =
EXC_MASK_BAD_ACCESS | EXC_MASK_BAD_ACCESS |
EXC_MASK_BAD_INSTRUCTION | EXC_MASK_BAD_INSTRUCTION |
EXC_MASK_ARITHMETIC | EXC_MASK_ARITHMETIC |

View File

@ -28,7 +28,7 @@ namespace crashpad {
namespace { namespace {
const int kNanosecondsPerMillisecond = 1E6; constexpr int kNanosecondsPerMillisecond = 1E6;
// TimerRunning() determines whether |deadline| has passed. If |deadline| is // TimerRunning() determines whether |deadline| has passed. If |deadline| is
// kMachMessageDeadlineWaitIndefinitely, |*timeout_options| is set to // kMachMessageDeadlineWaitIndefinitely, |*timeout_options| is set to

View File

@ -26,7 +26,7 @@ namespace crashpad {
//! //!
//! This constant is provided because the macros normally used to request this //! This constant is provided because the macros normally used to request this
//! behavior are cumbersome. //! behavior are cumbersome.
const mach_msg_option_t kMachMessageReceiveAuditTrailer = constexpr mach_msg_option_t kMachMessageReceiveAuditTrailer =
MACH_RCV_TRAILER_TYPE(MACH_MSG_TRAILER_FORMAT_0) | MACH_RCV_TRAILER_TYPE(MACH_MSG_TRAILER_FORMAT_0) |
MACH_RCV_TRAILER_ELEMENTS(MACH_RCV_TRAILER_AUDIT); MACH_RCV_TRAILER_ELEMENTS(MACH_RCV_TRAILER_AUDIT);

View File

@ -147,9 +147,9 @@ struct ConvertExceptionTraits {
ValueType* value) { ValueType* value) {
return StringToException(string, options, value); return StringToException(string, options, value);
} }
static const char kValueName[]; static constexpr char kValueName[] = "exception";
}; };
const char ConvertExceptionTraits::kValueName[] = "exception"; constexpr char ConvertExceptionTraits::kValueName[];
void TestExceptionToString(exception_type_t value, void TestExceptionToString(exception_type_t value,
const char* expect_full, const char* expect_full,
@ -322,9 +322,9 @@ struct ConvertExceptionMaskTraits {
ValueType* value) { ValueType* value) {
return StringToExceptionMask(string, options, value); return StringToExceptionMask(string, options, value);
} }
static const char kValueName[]; static constexpr char kValueName[] = "exception_mask";
}; };
const char ConvertExceptionMaskTraits::kValueName[] = "exception_mask"; constexpr char ConvertExceptionMaskTraits::kValueName[];
void TestExceptionMaskToString(exception_mask_t value, void TestExceptionMaskToString(exception_mask_t value,
const char* expect_full, const char* expect_full,
@ -565,9 +565,9 @@ struct ConvertExceptionBehaviorTraits {
ValueType* value) { ValueType* value) {
return StringToExceptionBehavior(string, options, value); return StringToExceptionBehavior(string, options, value);
} }
static const char kValueName[]; static constexpr char kValueName[] = "behavior";
}; };
const char ConvertExceptionBehaviorTraits::kValueName[] = "behavior"; constexpr char ConvertExceptionBehaviorTraits::kValueName[];
void TestExceptionBehaviorToString(exception_behavior_t value, void TestExceptionBehaviorToString(exception_behavior_t value,
const char* expect_full, const char* expect_full,
@ -828,9 +828,9 @@ struct ConvertThreadStateFlavorTraits {
ValueType* value) { ValueType* value) {
return StringToThreadStateFlavor(string, options, value); return StringToThreadStateFlavor(string, options, value);
} }
static const char kValueName[]; static constexpr char kValueName[] = "flavor";
}; };
const char ConvertThreadStateFlavorTraits::kValueName[] = "flavor"; constexpr char ConvertThreadStateFlavorTraits::kValueName[];
void TestThreadStateFlavorToString(exception_type_t value, void TestThreadStateFlavorToString(exception_type_t value,
const char* expect_full, const char* expect_full,

View File

@ -22,7 +22,7 @@
namespace { namespace {
const uint64_t kNanosecondsPerSecond = 1E9; constexpr uint64_t kNanosecondsPerSecond = 1E9;
} // namespace } // namespace

View File

@ -1,23 +0,0 @@
// Copyright 2014 The Crashpad Authors. All rights reserved.
//
// 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 "util/net/http_headers.h"
namespace crashpad {
const char kContentType[] = "Content-Type";
const char kContentLength[] = "Content-Length";
const char kContentEncoding[] = "Content-Encoding";
} // namespace crashpad

View File

@ -24,13 +24,13 @@ namespace crashpad {
using HTTPHeaders = std::map<std::string, std::string>; using HTTPHeaders = std::map<std::string, std::string>;
//! \brief The header name `"Content-Type"`. //! \brief The header name `"Content-Type"`.
extern const char kContentType[]; constexpr char kContentType[] = "Content-Type";
//! \brief The header name `"Content-Length"`. //! \brief The header name `"Content-Length"`.
extern const char kContentLength[]; constexpr char kContentLength[] = "Content-Length";
//! \brief The header name `"Content-Encoding"`. //! \brief The header name `"Content-Encoding"`.
extern const char kContentEncoding[]; constexpr char kContentEncoding[] = "Content-Encoding";
} // namespace crashpad } // namespace crashpad

View File

@ -39,7 +39,7 @@ namespace crashpad {
namespace { namespace {
const wchar_t kWinHttpDll[] = L"winhttp.dll"; constexpr wchar_t kWinHttpDll[] = L"winhttp.dll";
std::string UserAgent() { std::string UserAgent() {
std::string user_agent = std::string user_agent =

View File

@ -25,8 +25,8 @@ namespace crashpad {
namespace test { namespace test {
namespace { namespace {
const int32_t kInt32Min = std::numeric_limits<int32_t>::min(); constexpr int32_t kInt32Min = std::numeric_limits<int32_t>::min();
const int64_t kInt64Min = std::numeric_limits<int64_t>::min(); constexpr int64_t kInt64Min = std::numeric_limits<int64_t>::min();
TEST(InRangeCast, Uint32) { TEST(InRangeCast, Uint32) {
EXPECT_EQ(InRangeCast<uint32_t>(0, 1), 0u); EXPECT_EQ(InRangeCast<uint32_t>(0, 1), 0u);

View File

@ -22,7 +22,7 @@ namespace crashpad {
namespace test { namespace test {
namespace { namespace {
const uint64_t kNanosecondsPerSecond = static_cast<uint64_t>(1E9); constexpr uint64_t kNanosecondsPerSecond = static_cast<uint64_t>(1E9);
class WorkDelegate : public WorkerThread::Delegate { class WorkDelegate : public WorkerThread::Delegate {
public: public:

View File

@ -140,7 +140,6 @@
'net/http_body.h', 'net/http_body.h',
'net/http_body_gzip.cc', 'net/http_body_gzip.cc',
'net/http_body_gzip.h', 'net/http_body_gzip.h',
'net/http_headers.cc',
'net/http_headers.h', 'net/http_headers.h',
'net/http_multipart_builder.cc', 'net/http_multipart_builder.cc',
'net/http_multipart_builder.h', 'net/http_multipart_builder.h',

View File

@ -22,7 +22,7 @@ namespace crashpad {
namespace { namespace {
const uint64_t kMicrosecondsPerSecond = static_cast<uint64_t>(1E6); constexpr uint64_t kMicrosecondsPerSecond = static_cast<uint64_t>(1E6);
uint64_t FiletimeToMicroseconds(const FILETIME& filetime) { uint64_t FiletimeToMicroseconds(const FILETIME& filetime) {
uint64_t t = (static_cast<uint64_t>(filetime.dwHighDateTime) << 32) | uint64_t t = (static_cast<uint64_t>(filetime.dwHighDateTime) << 32) |