Coverage Report

Created: 2025-04-27 06:20

/src/LPM/external.protobuf/include/absl/log/internal/nullguard.h
Line
Count
Source (jump to first uncovered line)
1
// Copyright 2022 The Abseil Authors.
2
//
3
// Licensed under the Apache License, Version 2.0 (the "License");
4
// you may not use this file except in compliance with the License.
5
// You may obtain a copy of the License at
6
//
7
//      https://www.apache.org/licenses/LICENSE-2.0
8
//
9
// Unless required by applicable law or agreed to in writing, software
10
// distributed under the License is distributed on an "AS IS" BASIS,
11
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12
// See the License for the specific language governing permissions and
13
// limitations under the License.
14
//
15
// -----------------------------------------------------------------------------
16
// File: log/internal/nullguard.h
17
// -----------------------------------------------------------------------------
18
//
19
// NullGuard exists such that NullGuard<T>::Guard(v) returns v, unless passed a
20
// nullptr_t, or a null char* or const char*, in which case it returns "(null)".
21
// This allows streaming NullGuard<T>::Guard(v) to an output stream without
22
// hitting undefined behavior for null values.
23
24
#ifndef ABSL_LOG_INTERNAL_NULLGUARD_H_
25
#define ABSL_LOG_INTERNAL_NULLGUARD_H_
26
27
#include <array>
28
#include <cstddef>
29
30
#include "absl/base/attributes.h"
31
#include "absl/base/config.h"
32
33
namespace absl {
34
ABSL_NAMESPACE_BEGIN
35
namespace log_internal {
36
37
ABSL_CONST_INIT ABSL_DLL extern const std::array<char, 7> kCharNull;
38
ABSL_CONST_INIT ABSL_DLL extern const std::array<signed char, 7>
39
    kSignedCharNull;
40
ABSL_CONST_INIT ABSL_DLL extern const std::array<unsigned char, 7>
41
    kUnsignedCharNull;
42
43
template <typename T>
44
struct NullGuard final {
45
  static const T& Guard(const T& v) { return v; }
46
};
47
template <>
48
struct NullGuard<char*> final {
49
0
  static const char* Guard(const char* v) { return v ? v : kCharNull.data(); }
50
};
51
template <>
52
struct NullGuard<const char*> final {
53
0
  static const char* Guard(const char* v) { return v ? v : kCharNull.data(); }
54
};
55
template <>
56
struct NullGuard<signed char*> final {
57
0
  static const signed char* Guard(const signed char* v) {
58
0
    return v ? v : kSignedCharNull.data();
59
0
  }
60
};
61
template <>
62
struct NullGuard<const signed char*> final {
63
0
  static const signed char* Guard(const signed char* v) {
64
0
    return v ? v : kSignedCharNull.data();
65
0
  }
66
};
67
template <>
68
struct NullGuard<unsigned char*> final {
69
0
  static const unsigned char* Guard(const unsigned char* v) {
70
0
    return v ? v : kUnsignedCharNull.data();
71
0
  }
72
};
73
template <>
74
struct NullGuard<const unsigned char*> final {
75
0
  static const unsigned char* Guard(const unsigned char* v) {
76
0
    return v ? v : kUnsignedCharNull.data();
77
0
  }
78
};
79
template <>
80
struct NullGuard<std::nullptr_t> final {
81
0
  static const char* Guard(const std::nullptr_t&) { return kCharNull.data(); }
82
};
83
84
}  // namespace log_internal
85
ABSL_NAMESPACE_END
86
}  // namespace absl
87
88
#endif  // ABSL_LOG_INTERNAL_NULLGUARD_H_