src: iterate metadata version entries with std::array · nodejs/node@c0f0845

5 files changed

lines changed

Original file line numberDiff line numberDiff line change

@@ -161,6 +161,28 @@ Metadata::Versions::Versions() {

161161

nbytes = NBYTES_VERSION;

162162

}

163163
164+

std::array<std::pair<std::string_view, std::string_view>,

165+

NODE_VERSIONS_KEY_COUNT>

166+

Metadata::Versions::pairs() const {

167+

std::array<std::pair<std::string_view, std::string_view>,

168+

NODE_VERSIONS_KEY_COUNT>

169+

versions_array;

170+

auto slot = versions_array.begin();

171+
172+

#define V(key) \

173+

do { \

174+

*slot++ = std::pair<std::string_view, std::string_view>( \

175+

#key, per_process::metadata.versions.key); \

176+

} while (0);

177+

NODE_VERSIONS_KEYS(V)

178+

#undef V

179+
180+

std::ranges::sort(versions_array,

181+

[](auto& a, auto& b) { return a.first < b.first; });

182+
183+

return versions_array;

184+

}

185+
164186

Metadata::Release::Release() : name(NODE_RELEASE) {

165187

#if NODE_VERSION_IS_LTS

166188

lts = NODE_VERSION_LTS_CODENAME;

Original file line numberDiff line numberDiff line change

@@ -3,7 +3,9 @@

33
44

#if defined(NODE_WANT_INTERNALS) && NODE_WANT_INTERNALS

55
6+

#include <array>

67

#include <string>

8+

#include <utility>

79

#include "node_version.h"

810
911

#if HAVE_OPENSSL

@@ -98,6 +100,10 @@ namespace node {

98100

NODE_VERSIONS_KEY_QUIC(V) \

99101

NODE_VERSIONS_KEY_SQLITE(V)

100102
103+

#define V(key) +1

104+

constexpr int NODE_VERSIONS_KEY_COUNT = NODE_VERSIONS_KEYS(V);

105+

#undef V

106+
101107

class Metadata {

102108

public:

103109

Metadata();

@@ -118,6 +124,10 @@ class Metadata {

118124

#define V(key) std::string key;

119125

NODE_VERSIONS_KEYS(V)

120126

#undef V

127+
128+

std::array<std::pair<std::string_view, std::string_view>,

129+

NODE_VERSIONS_KEY_COUNT>

130+

pairs() const;

121131

};

122132
123133

struct Release {

Original file line numberDiff line numberDiff line change

@@ -83,24 +83,7 @@ static void SetVersions(Isolate* isolate, Local<Object> versions) {

8383

READONLY_STRING_PROPERTY(

8484

versions, "node", per_process::metadata.versions.node);

8585
86-

#define V(key) +1

87-

std::pair<std::string_view, std::string_view>

88-

versions_array[NODE_VERSIONS_KEYS(V)];

89-

#undef V

90-

auto* slot = &versions_array[0];

91-
92-

#define V(key) \

93-

do { \

94-

*slot++ = std::pair<std::string_view, std::string_view>( \

95-

#key, per_process::metadata.versions.key); \

96-

} while (0);

97-

NODE_VERSIONS_KEYS(V)

98-

#undef V

99-
100-

std::ranges::sort(versions_array,

101-

[](auto& a, auto& b) { return a.first < b.first; });

102-
103-

for (const auto& version : versions_array) {

86+

for (const auto& version : per_process::metadata.versions.pairs()) {

10487

versions

10588

->DefineOwnProperty(context,

10689

OneByteString(isolate, version.first),

Original file line numberDiff line numberDiff line change

@@ -797,24 +797,7 @@ static void PrintComponentVersions(JSONWriter* writer) {

797797
798798

writer->json_objectstart("componentVersions");

799799
800-

#define V(key) +1

801-

std::pair<std::string_view, std::string_view>

802-

versions_array[NODE_VERSIONS_KEYS(V)];

803-

#undef V

804-

auto* slot = &versions_array[0];

805-
806-

#define V(key) \

807-

do { \

808-

*slot++ = std::pair<std::string_view, std::string_view>( \

809-

#key, per_process::metadata.versions.key); \

810-

} while (0);

811-

NODE_VERSIONS_KEYS(V)

812-

#undef V

813-
814-

std::ranges::sort(versions_array,

815-

[](auto& a, auto& b) { return a.first < b.first; });

816-
817-

for (const auto& version : versions_array) {

800+

for (const auto& version : per_process::metadata.versions.pairs()) {

818801

writer->json_keyvalue(version.first, version.second);

819802

}

820803
Original file line numberDiff line numberDiff line change

@@ -239,13 +239,9 @@ std::unique_ptr<v8::ConvertableToTraceFormat> AsyncWrapArgs::Cast() const {

239239

std::unique_ptr<v8::ConvertableToTraceFormat> ProcessMeta::Cast() const {

240240

auto trace_process = tracing::TracedValue::Create();

241241

trace_process->BeginDictionary("versions");

242-
243-

#define V(key) \

244-

trace_process->SetString(#key, per_process::metadata.versions.key.c_str());

245-
246-

NODE_VERSIONS_KEYS(V)

247-

#undef V

248-
242+

for (const auto& version : per_process::metadata.versions.pairs()) {

243+

trace_process->SetString(version.first.data(), version.second.data());

244+

}

249245

trace_process->EndDictionary();

250246
251247

trace_process->SetString("arch", per_process::metadata.arch.c_str());