more changes

This commit is contained in:
Jacob Dufault 2017-03-25 16:58:11 -07:00
parent 8219a39a32
commit c8afc0f022
10 changed files with 371 additions and 689 deletions

View File

@ -92,36 +92,6 @@ std::string Join(const std::vector<std::string>& elements, std::string sep) {
return result; return result;
} }
struct Ipc_Quit : public IpcMessage<Ipc_Quit> {
static constexpr IpcId kIpcId = IpcId::Quit;
};
template <typename TVisitor>
void Reflect(TVisitor& visitor, Ipc_Quit& value) {}
struct Ipc_IsAlive : public IpcMessage<Ipc_IsAlive> {
static constexpr IpcId kIpcId = IpcId::IsAlive;
};
template <typename TVisitor>
void Reflect(TVisitor& visitor, Ipc_IsAlive& value) {}
struct Ipc_OpenProject : public IpcMessage<Ipc_OpenProject> {
static constexpr IpcId kIpcId = IpcId::OpenProject;
std::string project_path;
};
template <typename TVisitor>
void Reflect(TVisitor& visitor, Ipc_OpenProject& value) {
Reflect(visitor, value.project_path);
}
struct Ipc_Cout : public IpcMessage<Ipc_Cout> {
static constexpr IpcId kIpcId = IpcId::Cout;
std::string content;
};
template <typename TVisitor>
void Reflect(TVisitor& visitor, Ipc_Cout& value) {
Reflect(visitor, value.content);
}
template<typename T> template<typename T>
void SendOutMessageToClient(IpcMessageQueue* queue, T& response) { void SendOutMessageToClient(IpcMessageQueue* queue, T& response) {
std::ostringstream sstream; std::ostringstream sstream;
@ -132,8 +102,6 @@ void SendOutMessageToClient(IpcMessageQueue* queue, T& response) {
queue->SendMessage(&queue->for_client, Ipc_Cout::kIpcId, out); queue->SendMessage(&queue->for_client, Ipc_Cout::kIpcId, out);
} }
template<typename T> template<typename T>
void RegisterId(IpcMessageQueue* t) { void RegisterId(IpcMessageQueue* t) {
t->RegisterId(T::kIpcId, t->RegisterId(T::kIpcId,
@ -767,7 +735,7 @@ int main(int argc, char** argv) {
if (context.shouldExit()) if (context.shouldExit())
return res; return res;
//RunTests(); RunTests();
return 0; return 0;
} }
else if (options.find("--help") != options.end()) { else if (options.find("--help") != options.end()) {

28
src/ipc.cc Normal file
View File

@ -0,0 +1,28 @@
#include "ipc.h"
#include <cassert>
const char* IpcIdToString(IpcId id) {
switch (id) {
case IpcId::CancelRequest:
return "$/cancelRequest";
case IpcId::Initialize:
return "initialize";
case IpcId::Initialized:
return "initialized";
case IpcId::TextDocumentDocumentSymbol:
return "textDocument/documentSymbol";
case IpcId::TextDocumentCodeLens:
return "textDocument/codeLens";
case IpcId::CodeLensResolve:
return "codeLens/resolve";
case IpcId::WorkspaceSymbol:
return "workspace/symbol";
default:
assert(false);
exit(1);
}
}
BaseIpcMessage::BaseIpcMessage(IpcId method_id)
: method_id(method_id) {}

58
src/ipc.h Normal file
View File

@ -0,0 +1,58 @@
#pragma once
#include "utils.h"
#include "serializer.h"
#include <string>
enum class IpcId : int {
// Language server specific requests.
CancelRequest = 0,
Initialize,
Initialized,
TextDocumentDocumentSymbol,
TextDocumentCodeLens,
CodeLensResolve,
WorkspaceSymbol,
// Internal implementation detail.
Quit,
IsAlive,
OpenProject,
Cout
};
MAKE_ENUM_HASHABLE(IpcId)
MAKE_REFLECT_TYPE_PROXY(IpcId, int)
const char* IpcIdToString(IpcId id);
struct BaseIpcMessage {
const IpcId method_id;
BaseIpcMessage(IpcId method_id);
};
template <typename T>
struct IpcMessage : public BaseIpcMessage {
IpcMessage() : BaseIpcMessage(T::kIpcId) {}
};
struct Ipc_Quit : public IpcMessage<Ipc_Quit> {
static constexpr IpcId kIpcId = IpcId::Quit;
};
MAKE_REFLECT_EMPTY_STRUCT(Ipc_Quit);
struct Ipc_IsAlive : public IpcMessage<Ipc_IsAlive> {
static constexpr IpcId kIpcId = IpcId::IsAlive;
};
MAKE_REFLECT_EMPTY_STRUCT(Ipc_IsAlive);
struct Ipc_OpenProject : public IpcMessage<Ipc_OpenProject> {
static constexpr IpcId kIpcId = IpcId::OpenProject;
std::string project_path;
};
MAKE_REFLECT_STRUCT(Ipc_OpenProject, project_path);
struct Ipc_Cout : public IpcMessage<Ipc_Cout> {
static constexpr IpcId kIpcId = IpcId::Cout;
std::string content;
};
MAKE_REFLECT_STRUCT(Ipc_Cout, content);

View File

@ -1,27 +1,5 @@
#include "language_server_api.h" #include "language_server_api.h"
const char* IpcIdToString(IpcId id) {
switch (id) {
case IpcId::CancelRequest:
return "$/cancelRequest";
case IpcId::Initialize:
return "initialize";
case IpcId::Initialized:
return "initialized";
case IpcId::TextDocumentDocumentSymbol:
return "textDocument/documentSymbol";
case IpcId::TextDocumentCodeLens:
return "textDocument/codeLens";
case IpcId::CodeLensResolve:
return "codeLens/resolve";
case IpcId::WorkspaceSymbol:
return "workspace/symbol";
default:
assert(false);
exit(1);
}
}
void Reflect(Writer& visitor, lsRequestId& value) { void Reflect(Writer& visitor, lsRequestId& value) {
assert(value.id0.has_value() || value.id1.has_value()); assert(value.id0.has_value() || value.id1.has_value());
@ -111,9 +89,6 @@ MessageRegistry* MessageRegistry::instance() {
return instance_; return instance_;
} }
BaseIpcMessage::BaseIpcMessage(IpcId method_id)
: method_id(method_id) {}
void lsResponseError::Write(Writer& visitor) { void lsResponseError::Write(Writer& visitor) {
auto& value = *this; auto& value = *this;
int code = static_cast<int>(this->code); int code = static_cast<int>(this->code);

View File

@ -1,5 +1,6 @@
#pragma once #pragma once
#include "ipc.h"
#include "serializer.h" #include "serializer.h"
#include "utils.h" #include "utils.h"
@ -22,25 +23,6 @@ using std::experimental::nullopt;
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
enum class IpcId : int {
// Language server specific requests.
CancelRequest = 0,
Initialize,
Initialized,
TextDocumentDocumentSymbol,
TextDocumentCodeLens,
CodeLensResolve,
WorkspaceSymbol,
// Internal implementation detail.
Quit,
IsAlive,
OpenProject,
Cout
};
MAKE_ENUM_HASHABLE(IpcId)
MAKE_REFLECT_TYPE_PROXY(IpcId, int)
const char* IpcIdToString(IpcId id);
struct lsRequestId { struct lsRequestId {
optional<int> id0; optional<int> id0;
@ -99,8 +81,6 @@ void Reflect(Reader& visitor, lsRequestId& id);
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////// /////////////////////////////////////////////////////////////////////////////
struct BaseIpcMessage;
struct MessageRegistry { struct MessageRegistry {
static MessageRegistry* instance_; static MessageRegistry* instance_;
static MessageRegistry* instance(); static MessageRegistry* instance();
@ -123,15 +103,6 @@ struct MessageRegistry {
}; };
struct BaseIpcMessage {
const IpcId method_id;
BaseIpcMessage(IpcId method_id);
};
template <typename T>
struct IpcMessage : public BaseIpcMessage {
IpcMessage() : BaseIpcMessage(T::kIpcId) {}
};
template<typename TDerived> template<typename TDerived>
struct lsOutMessage { struct lsOutMessage {
@ -152,8 +123,6 @@ struct lsOutMessage {
} }
}; };
struct lsResponseError { struct lsResponseError {
struct Data { struct Data {
virtual void Write(Writer& writer) = 0; virtual void Write(Writer& writer) = 0;
@ -241,7 +210,7 @@ struct lsDocumentUri {
lsDocumentUri(); lsDocumentUri();
bool operator==(const lsDocumentUri& other) const; bool operator==(const lsDocumentUri& other) const;
void SetPath(const std::string& path); void SetPath(const std::string& path);
std::string GetPath(); std::string GetPath();
@ -266,14 +235,7 @@ struct lsPosition {
int character = 0; int character = 0;
}; };
MAKE_HASHABLE(lsPosition, t.line, t.character); MAKE_HASHABLE(lsPosition, t.line, t.character);
template<typename TVisitor> MAKE_REFLECT_STRUCT(lsPosition, line, character);
void Reflect(TVisitor& visitor, lsPosition& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(line);
REFLECT_MEMBER(character);
REFLECT_MEMBER_END();
}
struct lsRange { struct lsRange {
lsRange(); lsRange();
@ -285,15 +247,7 @@ struct lsRange {
lsPosition end; lsPosition end;
}; };
MAKE_HASHABLE(lsRange, t.start, t.end); MAKE_HASHABLE(lsRange, t.start, t.end);
MAKE_REFLECT_STRUCT(lsRange, start, end);
template<typename TVisitor>
void Reflect(TVisitor& visitor, lsRange& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(start);
REFLECT_MEMBER(end);
REFLECT_MEMBER_END();
}
struct lsLocation { struct lsLocation {
lsLocation(); lsLocation();
@ -304,15 +258,8 @@ struct lsLocation {
lsDocumentUri uri; lsDocumentUri uri;
lsRange range; lsRange range;
}; };
MAKE_HASHABLE(lsLocation, t.uri, t.range) MAKE_HASHABLE(lsLocation, t.uri, t.range);
template<typename TVisitor> MAKE_REFLECT_STRUCT(lsLocation, uri, range);
void Reflect(TVisitor& visitor, lsLocation& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(uri);
REFLECT_MEMBER(range);
REFLECT_MEMBER_END();
}
enum class lsSymbolKind : int { enum class lsSymbolKind : int {
File = 1, File = 1,
@ -334,7 +281,7 @@ enum class lsSymbolKind : int {
Boolean = 17, Boolean = 17,
Array = 18 Array = 18
}; };
MAKE_REFLECT_TYPE_PROXY(lsSymbolKind, int) MAKE_REFLECT_TYPE_PROXY(lsSymbolKind, int);
struct lsSymbolInformation { struct lsSymbolInformation {
std::string name; std::string name;
@ -342,16 +289,7 @@ struct lsSymbolInformation {
lsLocation location; lsLocation location;
std::string containerName; std::string containerName;
}; };
MAKE_REFLECT_STRUCT(lsSymbolInformation, name, kind, location, containerName);
template<typename TVisitor>
void Reflect(TVisitor& visitor, lsSymbolInformation& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(name);
REFLECT_MEMBER(kind);
REFLECT_MEMBER(location);
REFLECT_MEMBER(containerName);
REFLECT_MEMBER_END();
}
template<typename T> template<typename T>
struct lsCommand { struct lsCommand {
@ -362,7 +300,6 @@ struct lsCommand {
// Arguments to run the command with. // Arguments to run the command with.
T arguments; T arguments;
}; };
template<typename TVisitor, typename T> template<typename TVisitor, typename T>
void Reflect(TVisitor& visitor, lsCommand<T>& value) { void Reflect(TVisitor& visitor, lsCommand<T>& value) {
REFLECT_MEMBER_START(); REFLECT_MEMBER_START();
@ -383,7 +320,6 @@ struct lsCodeLens {
// a code lens and a code lens resolve request. // a code lens and a code lens resolve request.
TData data; TData data;
}; };
template<typename TVisitor, typename TData, typename TCommandArguments> template<typename TVisitor, typename TData, typename TCommandArguments>
void Reflect(TVisitor& visitor, lsCodeLens<TData, TCommandArguments>& value) { void Reflect(TVisitor& visitor, lsCodeLens<TData, TCommandArguments>& value) {
REFLECT_MEMBER_START(); REFLECT_MEMBER_START();
@ -399,13 +335,7 @@ void Reflect(TVisitor& visitor, lsCodeLens<TData, TCommandArguments>& value) {
struct lsTextDocumentIdentifier { struct lsTextDocumentIdentifier {
lsDocumentUri uri; lsDocumentUri uri;
}; };
MAKE_REFLECT_STRUCT(lsTextDocumentIdentifier, uri);
template<typename TVisitor>
void Reflect(TVisitor& visitor, lsTextDocumentIdentifier& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(uri);
REFLECT_MEMBER_END();
}
// TODO: TextDocumentItem // TODO: TextDocumentItem
// TODO: VersionedTextDocumentIdentifier // TODO: VersionedTextDocumentIdentifier
@ -550,31 +480,16 @@ struct lsWorkspaceClientCapabilites {
optional<lsGenericDynamicReg> executeCommand; optional<lsGenericDynamicReg> executeCommand;
}; };
template<typename TVisitor> MAKE_REFLECT_STRUCT(lsWorkspaceClientCapabilites::lsWorkspaceEdit, documentChanges);
void Reflect(TVisitor& visitor, lsWorkspaceClientCapabilites::lsWorkspaceEdit& value) { MAKE_REFLECT_STRUCT(lsWorkspaceClientCapabilites::lsGenericDynamicReg, dynamicRegistration);
REFLECT_MEMBER_START(); MAKE_REFLECT_STRUCT(lsWorkspaceClientCapabilites,
REFLECT_MEMBER(documentChanges); applyEdit,
REFLECT_MEMBER_END(); workspaceEdit,
} didChangeConfiguration,
didChangeWatchedFiles,
symbol,
executeCommand);
template<typename TVisitor>
void Reflect(TVisitor& visitor, lsWorkspaceClientCapabilites::lsGenericDynamicReg& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(dynamicRegistration);
REFLECT_MEMBER_END();
}
template<typename TVisitor>
void Reflect(TVisitor& visitor, lsWorkspaceClientCapabilites& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(applyEdit);
REFLECT_MEMBER(workspaceEdit);
REFLECT_MEMBER(didChangeConfiguration);
REFLECT_MEMBER(didChangeWatchedFiles);
REFLECT_MEMBER(symbol);
REFLECT_MEMBER(executeCommand);
REFLECT_MEMBER_END();
}
// Text document specific client capabilities. // Text document specific client capabilities.
@ -668,66 +583,27 @@ struct lsTextDocumentClientCapabilities {
optional<lsGenericDynamicReg> rename; optional<lsGenericDynamicReg> rename;
}; };
template<typename TVisitor> MAKE_REFLECT_STRUCT(lsTextDocumentClientCapabilities::lsSynchronization, dynamicRegistration, willSave, willSaveWaitUntil, didSave);
void Reflect(TVisitor& visitor, lsTextDocumentClientCapabilities::lsSynchronization& value) { MAKE_REFLECT_STRUCT(lsTextDocumentClientCapabilities::lsCompletion, dynamicRegistration, completionItem);
REFLECT_MEMBER_START(); MAKE_REFLECT_STRUCT(lsTextDocumentClientCapabilities::lsCompletion::lsCompletionItem, snippetSupport);
REFLECT_MEMBER(dynamicRegistration); MAKE_REFLECT_STRUCT(lsTextDocumentClientCapabilities::lsGenericDynamicReg, dynamicRegistration);
REFLECT_MEMBER(willSave); MAKE_REFLECT_STRUCT(lsTextDocumentClientCapabilities::CodeLensRegistrationOptions, dynamicRegistration, resolveProvider);
REFLECT_MEMBER(willSaveWaitUntil); MAKE_REFLECT_STRUCT(lsTextDocumentClientCapabilities,
REFLECT_MEMBER(didSave); synchronization,
REFLECT_MEMBER_END(); completion,
} hover,
signatureHelp,
template<typename TVisitor> references,
void Reflect(TVisitor& visitor, lsTextDocumentClientCapabilities::lsCompletion& value) { documentHighlight,
REFLECT_MEMBER_START(); documentSymbol,
REFLECT_MEMBER(dynamicRegistration); formatting,
REFLECT_MEMBER(completionItem); rangeFormatting,
REFLECT_MEMBER_END(); onTypeFormatting,
} definition,
codeAction,
template<typename TVisitor> codeLens,
void Reflect(TVisitor& visitor, lsTextDocumentClientCapabilities::lsCompletion::lsCompletionItem& value) { documentLink,
REFLECT_MEMBER_START(); rename);
REFLECT_MEMBER(snippetSupport);
REFLECT_MEMBER_END();
}
template<typename TVisitor>
void Reflect(TVisitor& visitor, lsTextDocumentClientCapabilities::lsGenericDynamicReg& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(dynamicRegistration);
REFLECT_MEMBER_END();
}
template<typename TVisitor>
void Reflect(TVisitor& visitor, lsTextDocumentClientCapabilities::CodeLensRegistrationOptions& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(dynamicRegistration);
REFLECT_MEMBER(resolveProvider);
REFLECT_MEMBER_END();
}
template<typename TVisitor>
void Reflect(TVisitor& visitor, lsTextDocumentClientCapabilities& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(synchronization);
REFLECT_MEMBER(completion);
REFLECT_MEMBER(hover);
REFLECT_MEMBER(signatureHelp);
REFLECT_MEMBER(references);
REFLECT_MEMBER(documentHighlight);
REFLECT_MEMBER(documentSymbol);
REFLECT_MEMBER(formatting);
REFLECT_MEMBER(rangeFormatting);
REFLECT_MEMBER(onTypeFormatting);
REFLECT_MEMBER(definition);
REFLECT_MEMBER(codeAction);
REFLECT_MEMBER(codeLens);
REFLECT_MEMBER(documentLink);
REFLECT_MEMBER(rename);
REFLECT_MEMBER_END();
}
struct lsClientCapabilities { struct lsClientCapabilities {
// Workspace specific client capabilities. // Workspace specific client capabilities.
@ -741,14 +617,7 @@ struct lsClientCapabilities {
*/ */
// experimental?: any; // TODO // experimental?: any; // TODO
}; };
MAKE_REFLECT_STRUCT(lsClientCapabilities, workspace, textDocument);
template<typename TVisitor>
void Reflect(TVisitor& visitor, lsClientCapabilities& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(workspace);
REFLECT_MEMBER(textDocument);
REFLECT_MEMBER_END();
}
struct lsInitializeParams { struct lsInitializeParams {
// The process Id of the parent process that started // The process Id of the parent process that started
@ -785,17 +654,7 @@ struct lsInitializeParams {
}; };
void Reflect(Reader& reader, lsInitializeParams::lsTrace& value); void Reflect(Reader& reader, lsInitializeParams::lsTrace& value);
void Reflect(Writer& writer, lsInitializeParams::lsTrace& value); void Reflect(Writer& writer, lsInitializeParams::lsTrace& value);
MAKE_REFLECT_STRUCT(lsInitializeParams, processId, rootPath, rootUri, capabilities, trace);
template<typename TVisitor>
void Reflect(TVisitor& visitor, lsInitializeParams& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(processId);
REFLECT_MEMBER(rootPath);
REFLECT_MEMBER(rootUri);
REFLECT_MEMBER(capabilities);
REFLECT_MEMBER(trace);
REFLECT_MEMBER_END();
}
struct lsInitializeError { struct lsInitializeError {
@ -804,13 +663,7 @@ struct lsInitializeError {
// in the ResponseError. // in the ResponseError.
bool retry; bool retry;
}; };
MAKE_REFLECT_STRUCT(lsInitializeError, retry);
template<typename TVisitor>
void Reflect(TVisitor& visitor, lsInitializeError& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(retry);
REFLECT_MEMBER_END();
}
// Defines how the host (editor) should sync document changes to the language server. // Defines how the host (editor) should sync document changes to the language server.
enum class lsTextDocumentSyncKind { enum class lsTextDocumentSyncKind {
@ -837,40 +690,21 @@ struct lsCompletionOptions {
// The characters that trigger completion automatically. // The characters that trigger completion automatically.
std::vector<std::string> triggerCharacters; std::vector<std::string> triggerCharacters;
}; };
MAKE_REFLECT_STRUCT(lsCompletionOptions, resolveProvider, triggerCharacters);
template<typename TVisitor>
void Reflect(TVisitor& visitor, lsCompletionOptions& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(resolveProvider);
REFLECT_MEMBER(triggerCharacters);
REFLECT_MEMBER_END();
}
// Signature help options. // Signature help options.
struct lsSignatureHelpOptions { struct lsSignatureHelpOptions {
// The characters that trigger signature help automatically. // The characters that trigger signature help automatically.
std::vector<std::string> triggerCharacters; std::vector<std::string> triggerCharacters;
}; };
MAKE_REFLECT_STRUCT(lsSignatureHelpOptions, triggerCharacters);
template<typename TVisitor>
void Reflect(TVisitor& visitor, lsSignatureHelpOptions& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(triggerCharacters);
REFLECT_MEMBER_END();
}
// Code Lens options. // Code Lens options.
struct lsCodeLensOptions { struct lsCodeLensOptions {
// Code lens has a resolve provider as well. // Code lens has a resolve provider as well.
bool resolveProvider = false; bool resolveProvider = false;
}; };
MAKE_REFLECT_STRUCT(lsCodeLensOptions, resolveProvider);
template<typename TVisitor>
void Reflect(TVisitor& visitor, lsCodeLensOptions& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(resolveProvider);
REFLECT_MEMBER_END();
}
// Format document on type options // Format document on type options
struct lsDocumentOnTypeFormattingOptions { struct lsDocumentOnTypeFormattingOptions {
@ -880,53 +714,28 @@ struct lsDocumentOnTypeFormattingOptions {
// More trigger characters. // More trigger characters.
std::vector<std::string> moreTriggerCharacter; std::vector<std::string> moreTriggerCharacter;
}; };
MAKE_REFLECT_STRUCT(lsDocumentOnTypeFormattingOptions, firstTriggerCharacter, moreTriggerCharacter);
template<typename TVisitor>
void Reflect(TVisitor& visitor, lsDocumentOnTypeFormattingOptions& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(firstTriggerCharacter);
REFLECT_MEMBER(moreTriggerCharacter);
REFLECT_MEMBER_END();
}
// Document link options // Document link options
struct lsDocumentLinkOptions { struct lsDocumentLinkOptions {
// Document links have a resolve provider as well. // Document links have a resolve provider as well.
bool resolveProvider = false; bool resolveProvider = false;
}; };
MAKE_REFLECT_STRUCT(lsDocumentLinkOptions, resolveProvider);
template<typename TVisitor>
void Reflect(TVisitor& visitor, lsDocumentLinkOptions& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(resolveProvider);
REFLECT_MEMBER_END();
}
// Execute command options. // Execute command options.
struct lsExecuteCommandOptions { struct lsExecuteCommandOptions {
// The commands to be executed on the server // The commands to be executed on the server
std::vector<std::string> commands; std::vector<std::string> commands;
}; };
MAKE_REFLECT_STRUCT(lsExecuteCommandOptions, commands);
template<typename TVisitor>
void Reflect(TVisitor& visitor, lsExecuteCommandOptions& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(commands);
REFLECT_MEMBER_END();
}
// Save options. // Save options.
struct lsSaveOptions { struct lsSaveOptions {
// The client is supposed to include the content on save. // The client is supposed to include the content on save.
bool includeText = false; bool includeText = false;
}; };
MAKE_REFLECT_STRUCT(lsSaveOptions, includeText);
template<typename TVisitor>
void Reflect(TVisitor& visitor, lsSaveOptions& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(includeText);
REFLECT_MEMBER_END();
}
struct lsTextDocumentSyncOptions { struct lsTextDocumentSyncOptions {
// Open and close notifications are sent to the server. // Open and close notifications are sent to the server.
@ -941,17 +750,7 @@ struct lsTextDocumentSyncOptions {
// Save notifications are sent to the server. // Save notifications are sent to the server.
optional<lsSaveOptions> save; optional<lsSaveOptions> save;
}; };
MAKE_REFLECT_STRUCT(lsTextDocumentSyncOptions, openClose, change, willSave, willSaveWaitUntil, save);
template<typename TVisitor>
void Reflect(TVisitor& visitor, lsTextDocumentSyncOptions& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(openClose);
REFLECT_MEMBER(change);
REFLECT_MEMBER(willSave);
REFLECT_MEMBER(willSaveWaitUntil);
REFLECT_MEMBER(save);
REFLECT_MEMBER_END();
}
struct lsServerCapabilities { struct lsServerCapabilities {
// Defines how text documents are synced. Is either a detailed structure defining each notification or // Defines how text documents are synced. Is either a detailed structure defining each notification or
@ -990,42 +789,30 @@ struct lsServerCapabilities {
// The server provides execute command support. // The server provides execute command support.
optional<lsExecuteCommandOptions> executeCommandProvider; optional<lsExecuteCommandOptions> executeCommandProvider;
}; };
MAKE_REFLECT_STRUCT(lsServerCapabilities,
template<typename TVisitor> textDocumentSync,
void Reflect(TVisitor& visitor, lsServerCapabilities& value) { hoverProvider,
REFLECT_MEMBER_START(); completionProvider,
REFLECT_MEMBER(textDocumentSync); signatureHelpProvider,
REFLECT_MEMBER(hoverProvider); definitionProvider,
REFLECT_MEMBER(completionProvider); referencesProvider,
REFLECT_MEMBER(signatureHelpProvider); documentHighlightProvider,
REFLECT_MEMBER(definitionProvider); documentSymbolProvider,
REFLECT_MEMBER(referencesProvider); workspaceSymbolProvider,
REFLECT_MEMBER(documentHighlightProvider); codeActionProvider,
REFLECT_MEMBER(documentSymbolProvider); codeLensProvider,
REFLECT_MEMBER(workspaceSymbolProvider); documentFormattingProvider,
REFLECT_MEMBER(codeActionProvider); documentRangeFormattingProvider,
REFLECT_MEMBER(codeLensProvider); documentOnTypeFormattingProvider,
REFLECT_MEMBER(documentFormattingProvider); renameProvider,
REFLECT_MEMBER(documentRangeFormattingProvider); documentLinkProvider,
REFLECT_MEMBER(documentOnTypeFormattingProvider); executeCommandProvider);
REFLECT_MEMBER(renameProvider);
REFLECT_MEMBER(documentLinkProvider);
REFLECT_MEMBER(executeCommandProvider);
REFLECT_MEMBER_END();
}
struct lsInitializeResult { struct lsInitializeResult {
// The capabilities the language server provides. // The capabilities the language server provides.
lsServerCapabilities capabilities; lsServerCapabilities capabilities;
}; };
MAKE_REFLECT_STRUCT(lsInitializeResult, capabilities);
template<typename TVisitor>
void Reflect(TVisitor& visitor, lsInitializeResult& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(capabilities);
REFLECT_MEMBER_END();
}
struct Ipc_InitializeRequest : public IpcMessage<Ipc_InitializeRequest> { struct Ipc_InitializeRequest : public IpcMessage<Ipc_InitializeRequest> {
const static IpcId kIpcId = IpcId::Initialize; const static IpcId kIpcId = IpcId::Initialize;
@ -1033,38 +820,20 @@ struct Ipc_InitializeRequest : public IpcMessage<Ipc_InitializeRequest> {
lsRequestId id; lsRequestId id;
lsInitializeParams params; lsInitializeParams params;
}; };
template<typename TVisitor> MAKE_REFLECT_STRUCT(Ipc_InitializeRequest, id, params);
void Reflect(TVisitor& visitor, Ipc_InitializeRequest& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(id);
REFLECT_MEMBER(params);
REFLECT_MEMBER_END();
}
struct Out_InitializeResponse : public lsOutMessage<Out_InitializeResponse> { struct Out_InitializeResponse : public lsOutMessage<Out_InitializeResponse> {
lsRequestId id; lsRequestId id;
lsInitializeResult result; lsInitializeResult result;
}; };
template<typename TVisitor> MAKE_REFLECT_STRUCT(Out_InitializeResponse, jsonrpc, id, result);
void Reflect(TVisitor& visitor, Out_InitializeResponse& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(jsonrpc);
REFLECT_MEMBER(id);
REFLECT_MEMBER(result);
REFLECT_MEMBER_END();
}
struct Ipc_InitializedNotification : public IpcMessage<Ipc_InitializedNotification> { struct Ipc_InitializedNotification : public IpcMessage<Ipc_InitializedNotification> {
const static IpcId kIpcId = IpcId::Initialized; const static IpcId kIpcId = IpcId::Initialized;
lsRequestId id; lsRequestId id;
}; };
template<typename TVisitor> MAKE_REFLECT_STRUCT(Ipc_InitializedNotification, id);
void Reflect(TVisitor& visitor, Ipc_InitializedNotification& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(id);
REFLECT_MEMBER_END();
}
@ -1112,65 +881,33 @@ struct Ipc_CancelRequest : public IpcMessage<Ipc_CancelRequest> {
static const IpcId kIpcId = IpcId::CancelRequest; static const IpcId kIpcId = IpcId::CancelRequest;
lsRequestId id; lsRequestId id;
}; };
template<typename TVisitor> MAKE_REFLECT_STRUCT(Ipc_CancelRequest, id);
void Reflect(TVisitor& visitor, Ipc_CancelRequest& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(id);
REFLECT_MEMBER_END();
}
// List symbols in a document. // List symbols in a document.
struct lsDocumentSymbolParams { struct lsDocumentSymbolParams {
lsTextDocumentIdentifier textDocument; lsTextDocumentIdentifier textDocument;
}; };
template<typename TVisitor> MAKE_REFLECT_STRUCT(lsDocumentSymbolParams, textDocument);
void Reflect(TVisitor& visitor, lsDocumentSymbolParams& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(textDocument);
REFLECT_MEMBER_END();
}
struct Ipc_TextDocumentDocumentSymbol : public IpcMessage<Ipc_TextDocumentDocumentSymbol> { struct Ipc_TextDocumentDocumentSymbol : public IpcMessage<Ipc_TextDocumentDocumentSymbol> {
const static IpcId kIpcId = IpcId::TextDocumentDocumentSymbol; const static IpcId kIpcId = IpcId::TextDocumentDocumentSymbol;
lsRequestId id; lsRequestId id;
lsDocumentSymbolParams params; lsDocumentSymbolParams params;
}; };
template<typename TVisitor> MAKE_REFLECT_STRUCT(Ipc_TextDocumentDocumentSymbol, id, params);
void Reflect(TVisitor& visitor, Ipc_TextDocumentDocumentSymbol& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(id);
REFLECT_MEMBER(params);
REFLECT_MEMBER_END();
}
struct Out_TextDocumentDocumentSymbol : public lsOutMessage<Out_TextDocumentDocumentSymbol> { struct Out_TextDocumentDocumentSymbol : public lsOutMessage<Out_TextDocumentDocumentSymbol> {
lsRequestId id; lsRequestId id;
std::vector<lsSymbolInformation> result; std::vector<lsSymbolInformation> result;
}; };
template<typename TVisitor> MAKE_REFLECT_STRUCT(Out_TextDocumentDocumentSymbol, jsonrpc, id, result);
void Reflect(TVisitor& visitor, Out_TextDocumentDocumentSymbol& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(jsonrpc);
REFLECT_MEMBER(id);
REFLECT_MEMBER(result);
REFLECT_MEMBER_END();
}
// List code lens in a document. // List code lens in a document.
struct lsDocumentCodeLensParams { struct lsDocumentCodeLensParams {
lsTextDocumentIdentifier textDocument; lsTextDocumentIdentifier textDocument;
}; };
template<typename TVisitor> MAKE_REFLECT_STRUCT(lsDocumentCodeLensParams, textDocument);
void Reflect(TVisitor& visitor, lsDocumentCodeLensParams& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(textDocument);
REFLECT_MEMBER_END();
}
struct lsCodeLensUserData {}; struct lsCodeLensUserData {};
template<typename TVisitor> MAKE_REFLECT_EMPTY_STRUCT(lsCodeLensUserData);
void Reflect(TVisitor& visitor, lsCodeLensUserData& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER_END();
}
struct lsCodeLensCommandArguments { struct lsCodeLensCommandArguments {
lsDocumentUri uri; lsDocumentUri uri;
lsPosition position; lsPosition position;
@ -1184,85 +921,41 @@ struct Ipc_TextDocumentCodeLens : public IpcMessage<Ipc_TextDocumentCodeLens> {
lsRequestId id; lsRequestId id;
lsDocumentCodeLensParams params; lsDocumentCodeLensParams params;
}; };
template<typename TVisitor> MAKE_REFLECT_STRUCT(Ipc_TextDocumentCodeLens, id, params);
void Reflect(TVisitor& visitor, Ipc_TextDocumentCodeLens& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(id);
REFLECT_MEMBER(params);
REFLECT_MEMBER_END();
}
struct Out_TextDocumentCodeLens : public lsOutMessage<Out_TextDocumentCodeLens> { struct Out_TextDocumentCodeLens : public lsOutMessage<Out_TextDocumentCodeLens> {
lsRequestId id; lsRequestId id;
std::vector<lsCodeLens<lsCodeLensUserData, lsCodeLensCommandArguments>> result; std::vector<lsCodeLens<lsCodeLensUserData, lsCodeLensCommandArguments>> result;
}; };
template<typename TVisitor> MAKE_REFLECT_STRUCT(Out_TextDocumentCodeLens, jsonrpc, id, result);
void Reflect(TVisitor& visitor, Out_TextDocumentCodeLens& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(jsonrpc);
REFLECT_MEMBER(id);
REFLECT_MEMBER(result);
REFLECT_MEMBER_END();
}
struct Ipc_CodeLensResolve : public IpcMessage<Ipc_CodeLensResolve> { struct Ipc_CodeLensResolve : public IpcMessage<Ipc_CodeLensResolve> {
const static IpcId kIpcId = IpcId::CodeLensResolve; const static IpcId kIpcId = IpcId::CodeLensResolve;
lsRequestId id; lsRequestId id;
TCodeLens params; TCodeLens params;
}; };
template<typename TVisitor> MAKE_REFLECT_STRUCT(Ipc_CodeLensResolve, id, params);
void Reflect(TVisitor& visitor, Ipc_CodeLensResolve& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(id);
REFLECT_MEMBER(params);
REFLECT_MEMBER_END();
}
struct Out_CodeLensResolve : public lsOutMessage<Out_CodeLensResolve> { struct Out_CodeLensResolve : public lsOutMessage<Out_CodeLensResolve> {
lsRequestId id; lsRequestId id;
TCodeLens result; TCodeLens result;
}; };
template<typename TVisitor> MAKE_REFLECT_STRUCT(Out_CodeLensResolve, jsonrpc, id, result);
void Reflect(TVisitor& visitor, Out_CodeLensResolve& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(jsonrpc);
REFLECT_MEMBER(id);
REFLECT_MEMBER(result);
REFLECT_MEMBER_END();
}
// Search for symbols in the workspace. // Search for symbols in the workspace.
struct lsWorkspaceSymbolParams { struct lsWorkspaceSymbolParams {
std::string query; std::string query;
}; };
template<typename TVisitor> MAKE_REFLECT_STRUCT(lsWorkspaceSymbolParams, query);
void Reflect(TVisitor& visitor, lsWorkspaceSymbolParams& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(query);
REFLECT_MEMBER_END();
}
struct Ipc_WorkspaceSymbol : public IpcMessage<Ipc_WorkspaceSymbol > { struct Ipc_WorkspaceSymbol : public IpcMessage<Ipc_WorkspaceSymbol > {
const static IpcId kIpcId = IpcId::WorkspaceSymbol; const static IpcId kIpcId = IpcId::WorkspaceSymbol;
lsRequestId id; lsRequestId id;
lsWorkspaceSymbolParams params; lsWorkspaceSymbolParams params;
}; };
template<typename TVisitor> MAKE_REFLECT_STRUCT(Ipc_WorkspaceSymbol, id, params);
void Reflect(TVisitor& visitor, Ipc_WorkspaceSymbol& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(id);
REFLECT_MEMBER(params);
REFLECT_MEMBER_END();
}
struct Out_WorkspaceSymbol : public lsOutMessage<Out_WorkspaceSymbol> { struct Out_WorkspaceSymbol : public lsOutMessage<Out_WorkspaceSymbol> {
lsRequestId id; lsRequestId id;
std::vector<lsSymbolInformation> result; std::vector<lsSymbolInformation> result;
}; };
template<typename TVisitor> MAKE_REFLECT_STRUCT(Out_WorkspaceSymbol, jsonrpc, id, result);
void Reflect(TVisitor& visitor, Out_WorkspaceSymbol& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(jsonrpc);
REFLECT_MEMBER(id);
REFLECT_MEMBER(result);
REFLECT_MEMBER_END();
}
// Show a message to the user. // Show a message to the user.
enum class lsMessageType : int { enum class lsMessageType : int {
@ -1276,19 +969,13 @@ struct Out_ShowLogMessageParams {
lsMessageType type = lsMessageType::Error; lsMessageType type = lsMessageType::Error;
std::string message; std::string message;
}; };
template<typename TVisitor> MAKE_REFLECT_STRUCT(Out_ShowLogMessageParams, type, message);
void Reflect(TVisitor& visitor, Out_ShowLogMessageParams& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(type);
REFLECT_MEMBER(message);
REFLECT_MEMBER_END();
}
struct Out_ShowLogMessage : public lsOutMessage<Out_ShowLogMessage> { struct Out_ShowLogMessage : public lsOutMessage<Out_ShowLogMessage> {
enum class DisplayType { enum class DisplayType {
Show, Log Show, Log
}; };
DisplayType display_type = DisplayType::Show; DisplayType display_type = DisplayType::Show;
std::string method(); std::string method();
Out_ShowLogMessageParams params; Out_ShowLogMessageParams params;
}; };

View File

@ -58,16 +58,7 @@ struct QueryableLocation {
interesting < o.interesting; interesting < o.interesting;
} }
}; };
MAKE_REFLECT_STRUCT(QueryableLocation, path, line, column, interesting);
template<typename TVisitor>
void Reflect(TVisitor& visitor, QueryableLocation& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(path);
REFLECT_MEMBER(line);
REFLECT_MEMBER(column);
REFLECT_MEMBER(interesting);
REFLECT_MEMBER_END();
}
struct UsrRef { struct UsrRef {
Usr usr; Usr usr;
@ -84,14 +75,7 @@ struct UsrRef {
return usr < other.usr && loc < other.loc; return usr < other.usr && loc < other.loc;
} }
}; };
MAKE_REFLECT_STRUCT(UsrRef, usr, loc);
template<typename TVisitor>
void Reflect(TVisitor& visitor, UsrRef& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(usr);
REFLECT_MEMBER(loc);
REFLECT_MEMBER_END();
}
// There are two sources of reindex updates: the (single) definition of a // There are two sources of reindex updates: the (single) definition of a
// symbol has changed, or one of many users of the symbol has changed. // symbol has changed, or one of many users of the symbol has changed.
@ -135,14 +119,7 @@ struct QueryableFile {
QueryableFile() {} // For serialization. QueryableFile() {} // For serialization.
QueryableFile(const IndexedFile& indexed); QueryableFile(const IndexedFile& indexed);
}; };
MAKE_REFLECT_STRUCT(QueryableFile, file_id, outline);
template<typename TVisitor>
void Reflect(TVisitor& visitor, QueryableFile& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(file_id);
REFLECT_MEMBER(outline);
REFLECT_MEMBER_END();
}
struct QueryableTypeDef { struct QueryableTypeDef {
using DefUpdate = TypeDefDefinitionData<Usr, Usr, Usr, QueryableLocation>; using DefUpdate = TypeDefDefinitionData<Usr, Usr, Usr, QueryableLocation>;
@ -156,15 +133,7 @@ struct QueryableTypeDef {
QueryableTypeDef() : def("") {} // For serialization. QueryableTypeDef() : def("") {} // For serialization.
QueryableTypeDef(IdCache& id_cache, const IndexedTypeDef& indexed); QueryableTypeDef(IdCache& id_cache, const IndexedTypeDef& indexed);
}; };
MAKE_REFLECT_STRUCT(QueryableTypeDef, def, derived, uses);
template<typename TVisitor>
void Reflect(TVisitor& visitor, QueryableTypeDef& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(def);
REFLECT_MEMBER(derived);
REFLECT_MEMBER(uses);
REFLECT_MEMBER_END();
}
struct QueryableFuncDef { struct QueryableFuncDef {
using DefUpdate = FuncDefDefinitionData<Usr, Usr, Usr, UsrRef, QueryableLocation>; using DefUpdate = FuncDefDefinitionData<Usr, Usr, Usr, UsrRef, QueryableLocation>;
@ -182,17 +151,7 @@ struct QueryableFuncDef {
QueryableFuncDef() : def("") {} // For serialization. QueryableFuncDef() : def("") {} // For serialization.
QueryableFuncDef(IdCache& id_cache, const IndexedFuncDef& indexed); QueryableFuncDef(IdCache& id_cache, const IndexedFuncDef& indexed);
}; };
MAKE_REFLECT_STRUCT(QueryableFuncDef, def, declarations, derived, callers, uses);
template<typename TVisitor>
void Reflect(TVisitor& visitor, QueryableFuncDef& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(def);
REFLECT_MEMBER(declarations);
REFLECT_MEMBER(derived);
REFLECT_MEMBER(callers);
REFLECT_MEMBER(uses);
REFLECT_MEMBER_END();
}
struct QueryableVarDef { struct QueryableVarDef {
using DefUpdate = VarDefDefinitionData<Usr, Usr, Usr, QueryableLocation>; using DefUpdate = VarDefDefinitionData<Usr, Usr, Usr, QueryableLocation>;
@ -204,14 +163,7 @@ struct QueryableVarDef {
QueryableVarDef() : def("") {} // For serialization. QueryableVarDef() : def("") {} // For serialization.
QueryableVarDef(IdCache& id_cache, const IndexedVarDef& indexed); QueryableVarDef(IdCache& id_cache, const IndexedVarDef& indexed);
}; };
MAKE_REFLECT_STRUCT(QueryableVarDef, def, uses);
template<typename TVisitor>
void Reflect(TVisitor& visitor, QueryableVarDef& value) {
REFLECT_MEMBER_START();
REFLECT_MEMBER(def);
REFLECT_MEMBER(uses);
REFLECT_MEMBER_END();
}
enum class SymbolKind { Invalid, File, Type, Func, Var }; enum class SymbolKind { Invalid, File, Type, Func, Var };
struct SymbolIdx { struct SymbolIdx {
@ -284,31 +236,26 @@ struct IndexUpdate {
// Merges the contents of |update| into this IndexUpdate instance. // Merges the contents of |update| into this IndexUpdate instance.
void Merge(const IndexUpdate& update); void Merge(const IndexUpdate& update);
}; };
MAKE_REFLECT_STRUCT(IndexUpdate,
template<typename TVisitor> files_removed,
void Reflect(TVisitor& visitor, IndexUpdate& value) { files_added,
REFLECT_MEMBER_START(); files_outline,
REFLECT_MEMBER(files_removed); types_removed,
REFLECT_MEMBER(files_added); types_added,
REFLECT_MEMBER(files_outline); types_def_changed,
REFLECT_MEMBER(types_removed); types_derived,
REFLECT_MEMBER(types_added); types_uses,
REFLECT_MEMBER(types_def_changed); funcs_removed,
REFLECT_MEMBER(types_derived); funcs_added,
REFLECT_MEMBER(types_uses); funcs_def_changed,
REFLECT_MEMBER(funcs_removed); funcs_declarations,
REFLECT_MEMBER(funcs_added); funcs_derived,
REFLECT_MEMBER(funcs_def_changed); funcs_callers,
REFLECT_MEMBER(funcs_declarations); funcs_uses,
REFLECT_MEMBER(funcs_derived); vars_removed,
REFLECT_MEMBER(funcs_callers); vars_added,
REFLECT_MEMBER(funcs_uses); vars_def_changed,
REFLECT_MEMBER(vars_removed); vars_uses);
REFLECT_MEMBER(vars_added);
REFLECT_MEMBER(vars_def_changed);
REFLECT_MEMBER(vars_uses);
REFLECT_MEMBER_END();
}
// The query database is heavily optimized for fast queries. It is stored // The query database is heavily optimized for fast queries. It is stored

View File

@ -1,5 +1,6 @@
#pragma once #pragma once
#include <macro_map.h>
#include <optional.h> #include <optional.h>
#include <rapidjson/document.h> #include <rapidjson/document.h>
#include <rapidjson/prettywriter.h> #include <rapidjson/prettywriter.h>
@ -38,6 +39,40 @@ struct IndexedFile;
value = static_cast<type>(value0); \ value = static_cast<type>(value0); \
} }
#define _MAPPABLE_REFLECT_MEMBER(name) \
REFLECT_MEMBER(name);
#define MAKE_REFLECT_EMPTY_STRUCT(type, ...) \
template<typename TVisitor> \
void Reflect(TVisitor& visitor, type& value) { \
REFLECT_MEMBER_START(); \
REFLECT_MEMBER_END(); \
}
#define MAKE_REFLECT_STRUCT(type, ...) \
template<typename TVisitor> \
void Reflect(TVisitor& visitor, type& value) { \
REFLECT_MEMBER_START(); \
MACRO_MAP(_MAPPABLE_REFLECT_MEMBER, __VA_ARGS__) \
REFLECT_MEMBER_END(); \
}
// API: // API:
/* /*
@ -158,156 +193,5 @@ void ReflectMember(Reader& visitor, const char* name, T& value) {
} }
} }
#if false
void Serialize(Writer& writer, int value);
void Serialize(Writer& writer, const std::string& value);
void Serialize(Writer& writer, Location location);
void Serialize(Writer& writer, uint64_t value);
void Serialize(Writer& writer, IndexedFile& file);
template<typename T>
void Serialize(Writer& writer, Id<T> id) {
writer.Uint64(id.id);
}
template<typename T>
void Serialize(Writer& writer, optional<T> value) {
if (value)
Serialize(writer, value.value());
else
writer.Null();
}
template<typename T>
void Serialize(Writer& writer, const std::vector<T>& values) {
writer.StartArray();
for (const T& value : values)
Serialize(writer, value);
writer.EndArray();
}
template<typename T>
void Serialize(Writer& writer, Ref<T> ref) {
std::string s = std::to_string(ref.id.id) + "@" + ref.loc.ToString();
writer.String(s.c_str());
}
template<typename T>
void Serialize(Writer& writer, const char* key, const std::vector<Ref<T>>& refs) {
if (refs.size() == 0)
return;
if (key) writer.Key(key);
writer.StartArray();
for (Ref<T> ref : refs)
Serialize(writer, nullptr, ref);
writer.EndArray();
}
#define SERIALIZE_MEMBER(name) \
SerializeMember(writer, #name, value.name)
#define SERIALIZE_MEMBER2(name, value) \
SerializeMember(writer, name, value)
#define DESERIALIZE_MEMBER(name) \
DeserializeMember(reader, #name, value.name)
#define DESERIALIZE_MEMBER2(name, value) \
DeserializeMember(reader, name, value)
// Special templates used by (DE)SERIALIZE_MEMBER macros.
template<typename T>
void SerializeMember(Writer& writer, const char* name, const T& value) {
writer.Key(name);
Serialize(writer, value);
}
template<typename T>
void SerializeMember(Writer& writer, const char* name, const std::vector<T>& value) {
if (value.empty())
return;
writer.Key(name);
Serialize(writer, value);
}
template<typename T>
void SerializeMember(Writer& writer, const char* name, const optional<T>& value) {
if (!value)
return;
writer.Key(name);
Serialize(writer, value.value());
}
void SerializeMember(Writer& writer, const char* name, const std::string& value);
template<typename T>
void DeserializeMember(const Reader& reader, const char* name, T& value) {
auto it = reader.FindMember(name);
if (it != reader.MemberEnd())
Deserialize(it->value, value);
}
template<typename T>
void Deserialize(const Reader& reader, Id<T>& output) {
output = Id<T>(reader.GetUint64());
}
template<typename T>
void Deserialize(const Reader& reader, Ref<T>& output) {
const char* str_value = reader.GetString();
uint64_t id = atoi(str_value);
const char* loc_string = strchr(str_value, '@') + 1;
output.id = Id<T>(id);
output.loc = Location(loc_string);
}
template<typename T>
void Deserialize(const Reader& reader, std::vector<T>& value) {
for (const auto& entry : reader.GetArray()) {
T entry_value;
Deserialize(entry, entry_value);
value.push_back(entry_value);
}
}
template<typename T>
void Deserialize(const Reader& reader, optional<T>& value) {
T real_value;
Deserialize(reader, real_value);
value = real_value;
}
void Deserialize(const Reader& reader, int& value);
void Deserialize(const Reader& reader, bool& value);
void Deserialize(const Reader& reader, std::string& value);
void Deserialize(const Reader& reader, Location& output);
void Deserialize(const Reader& reader, IndexedTypeDef& value);
void Deserialize(const Reader& reader, IndexedFuncDef& value);
void Deserialize(const Reader& reader, IndexedVarDef& value);
void Deserialize(const Reader& reader, IndexedFile& file);
#endif
std::string Serialize(IndexedFile& file); std::string Serialize(IndexedFile& file);
IndexedFile Deserialize(std::string path, std::string serialized); IndexedFile Deserialize(std::string path, std::string serialized);

View File

@ -99,7 +99,7 @@ void RunTests() {
for (std::string path : GetFilesInFolder("tests", true /*recursive*/, true /*add_folder_to_path*/)) { for (std::string path : GetFilesInFolder("tests", true /*recursive*/, true /*add_folder_to_path*/)) {
//if (path != "tests/templates/specialized_func_definition.cc") continue; //if (path != "tests/templates/specialized_func_definition.cc") continue;
//if (path != "tests/templates/namespace_template_class_template_func_usage_folded_into_one.cc") continue; //if (path != "tests/templates/namespace_template_class_template_func_usage_folded_into_one.cc") continue;
if (path != "tests/foo2.cc") continue; //if (path != "tests/foo2.cc") continue;
//if (path != "tests/namespaces/namespace_reference.cc") continue; //if (path != "tests/namespaces/namespace_reference.cc") continue;
//if (path != "tests/templates/implicit_variable_instantiation.cc") continue; //if (path != "tests/templates/implicit_variable_instantiation.cc") continue;

View File

@ -1,5 +1,6 @@
#pragma once #pragma once
#include <functional>
#include <string> #include <string>
#include <vector> #include <vector>
#include <memory> #include <memory>

134
third_party/macro_map.h vendored Normal file
View File

@ -0,0 +1,134 @@
/*
Boost Software License - Version 1.0 - August 17th, 2003
Permission is hereby granted, free of charge, to any person or organization
obtaining a copy of the software and accompanying documentation covered by
this license (the "Software") to use, reproduce, display, distribute,
execute, and transmit the Software, and to prepare derivative works of the
Software, and to permit third-parties to whom the Software is furnished to
do so, all subject to the following:
The copyright notices in the Software and this entire statement, including
the above license grant, this restriction and the following disclaimer,
must be included in all copies of the Software, in whole or in part, and
all derivative works of the Software, unless such copies or derivative
works are solely in the form of machine-executable object code generated by
a source language processor.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT
SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE
FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE,
ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
*/
// Taken from https://github.com/cbeck88/visit_struct.
//
// Usage
//
// #define PRINT_DOUBLE(x) printf(#x " = %d\n", x);
//
// MACRO_MAP(PRINT_DOUBLE, 1, 2, 3)
// #define PRINT_DOUBLES(...) MACRO_MAP(PRINT_DOUBLE, __VA_ARGS__)
#pragma once
static constexpr const int max_visitable_members = 69;
#define VISIT_STRUCT_EXPAND(x) x
#define VISIT_STRUCT_PP_ARG_N( \
_1, _2, _3, _4, _5, _6, _7, _8, _9, _10,\
_11, _12, _13, _14, _15, _16, _17, _18, _19, _20,\
_21, _22, _23, _24, _25, _26, _27, _28, _29, _30,\
_31, _32, _33, _34, _35, _36, _37, _38, _39, _40,\
_41, _42, _43, _44, _45, _46, _47, _48, _49, _50,\
_51, _52, _53, _54, _55, _56, _57, _58, _59, _60,\
_61, _62, _63, _64, _65, _66, _67, _68, _69, N, ...) N
#define VISIT_STRUCT_PP_NARG(...) VISIT_STRUCT_EXPAND(VISIT_STRUCT_PP_ARG_N(__VA_ARGS__, \
69, 68, 67, 66, 65, 64, 63, 62, 61, 60, \
59, 58, 57, 56, 55, 54, 53, 52, 51, 50, \
49, 48, 47, 46, 45, 44, 43, 42, 41, 40, \
39, 38, 37, 36, 35, 34, 33, 32, 31, 30, \
29, 28, 27, 26, 25, 24, 23, 22, 21, 20, \
19, 18, 17, 16, 15, 14, 13, 12, 11, 10, \
9, 8, 7, 6, 5, 4, 3, 2, 1, 0))
/* need extra level to force extra eval */
#define VISIT_STRUCT_CONCAT_(a,b) a ## b
#define VISIT_STRUCT_CONCAT(a,b) VISIT_STRUCT_CONCAT_(a,b)
#define VISIT_STRUCT_APPLYF0(f)
#define VISIT_STRUCT_APPLYF1(f,_1) f(_1)
#define VISIT_STRUCT_APPLYF2(f,_1,_2) f(_1) f(_2)
#define VISIT_STRUCT_APPLYF3(f,_1,_2,_3) f(_1) f(_2) f(_3)
#define VISIT_STRUCT_APPLYF4(f,_1,_2,_3,_4) f(_1) f(_2) f(_3) f(_4)
#define VISIT_STRUCT_APPLYF5(f,_1,_2,_3,_4,_5) f(_1) f(_2) f(_3) f(_4) f(_5)
#define VISIT_STRUCT_APPLYF6(f,_1,_2,_3,_4,_5,_6) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6)
#define VISIT_STRUCT_APPLYF7(f,_1,_2,_3,_4,_5,_6,_7) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7)
#define VISIT_STRUCT_APPLYF8(f,_1,_2,_3,_4,_5,_6,_7,_8) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8)
#define VISIT_STRUCT_APPLYF9(f,_1,_2,_3,_4,_5,_6,_7,_8,_9) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9)
#define VISIT_STRUCT_APPLYF10(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10)
#define VISIT_STRUCT_APPLYF11(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11)
#define VISIT_STRUCT_APPLYF12(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12)
#define VISIT_STRUCT_APPLYF13(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13)
#define VISIT_STRUCT_APPLYF14(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14)
#define VISIT_STRUCT_APPLYF15(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15)
#define VISIT_STRUCT_APPLYF16(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16)
#define VISIT_STRUCT_APPLYF17(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17)
#define VISIT_STRUCT_APPLYF18(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18)
#define VISIT_STRUCT_APPLYF19(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19)
#define VISIT_STRUCT_APPLYF20(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20)
#define VISIT_STRUCT_APPLYF21(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21)
#define VISIT_STRUCT_APPLYF22(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22)
#define VISIT_STRUCT_APPLYF23(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23)
#define VISIT_STRUCT_APPLYF24(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24)
#define VISIT_STRUCT_APPLYF25(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25)
#define VISIT_STRUCT_APPLYF26(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26)
#define VISIT_STRUCT_APPLYF27(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27)
#define VISIT_STRUCT_APPLYF28(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28)
#define VISIT_STRUCT_APPLYF29(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29)
#define VISIT_STRUCT_APPLYF30(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30)
#define VISIT_STRUCT_APPLYF31(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31)
#define VISIT_STRUCT_APPLYF32(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32)
#define VISIT_STRUCT_APPLYF33(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33)
#define VISIT_STRUCT_APPLYF34(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34)
#define VISIT_STRUCT_APPLYF35(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35)
#define VISIT_STRUCT_APPLYF36(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36)
#define VISIT_STRUCT_APPLYF37(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37)
#define VISIT_STRUCT_APPLYF38(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38)
#define VISIT_STRUCT_APPLYF39(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39)
#define VISIT_STRUCT_APPLYF40(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40)
#define VISIT_STRUCT_APPLYF41(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41)
#define VISIT_STRUCT_APPLYF42(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42)
#define VISIT_STRUCT_APPLYF43(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43)
#define VISIT_STRUCT_APPLYF44(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44)
#define VISIT_STRUCT_APPLYF45(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45)
#define VISIT_STRUCT_APPLYF46(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46)
#define VISIT_STRUCT_APPLYF47(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47)
#define VISIT_STRUCT_APPLYF48(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48)
#define VISIT_STRUCT_APPLYF49(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49)
#define VISIT_STRUCT_APPLYF50(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50)
#define VISIT_STRUCT_APPLYF51(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51)
#define VISIT_STRUCT_APPLYF52(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52)
#define VISIT_STRUCT_APPLYF53(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53)
#define VISIT_STRUCT_APPLYF54(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54)
#define VISIT_STRUCT_APPLYF55(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55)
#define VISIT_STRUCT_APPLYF56(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56)
#define VISIT_STRUCT_APPLYF57(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57)
#define VISIT_STRUCT_APPLYF58(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58)
#define VISIT_STRUCT_APPLYF59(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59)
#define VISIT_STRUCT_APPLYF60(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60)
#define VISIT_STRUCT_APPLYF61(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61)
#define VISIT_STRUCT_APPLYF62(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) f(_62)
#define VISIT_STRUCT_APPLYF63(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) f(_62) f(_63)
#define VISIT_STRUCT_APPLYF64(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) f(_62) f(_63) f(_64)
#define VISIT_STRUCT_APPLYF65(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) f(_62) f(_63) f(_64) f(_65)
#define VISIT_STRUCT_APPLYF66(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) f(_62) f(_63) f(_64) f(_65) f(_66)
#define VISIT_STRUCT_APPLYF67(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66,_67) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) f(_62) f(_63) f(_64) f(_65) f(_66) f(_67)
#define VISIT_STRUCT_APPLYF68(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66,_67,_68) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) f(_62) f(_63) f(_64) f(_65) f(_66) f(_67) f(_68)
#define VISIT_STRUCT_APPLYF69(f,_1,_2,_3,_4,_5,_6,_7,_8,_9,_10,_11,_12,_13,_14,_15,_16,_17,_18,_19,_20,_21,_22,_23,_24,_25,_26,_27,_28,_29,_30,_31,_32,_33,_34,_35,_36,_37,_38,_39,_40,_41,_42,_43,_44,_45,_46,_47,_48,_49,_50,_51,_52,_53,_54,_55,_56,_57,_58,_59,_60,_61,_62,_63,_64,_65,_66,_67,_68,_69) f(_1) f(_2) f(_3) f(_4) f(_5) f(_6) f(_7) f(_8) f(_9) f(_10) f(_11) f(_12) f(_13) f(_14) f(_15) f(_16) f(_17) f(_18) f(_19) f(_20) f(_21) f(_22) f(_23) f(_24) f(_25) f(_26) f(_27) f(_28) f(_29) f(_30) f(_31) f(_32) f(_33) f(_34) f(_35) f(_36) f(_37) f(_38) f(_39) f(_40) f(_41) f(_42) f(_43) f(_44) f(_45) f(_46) f(_47) f(_48) f(_49) f(_50) f(_51) f(_52) f(_53) f(_54) f(_55) f(_56) f(_57) f(_58) f(_59) f(_60) f(_61) f(_62) f(_63) f(_64) f(_65) f(_66) f(_67) f(_68) f(_69)
#define VISIT_STRUCT_APPLY_F_(M, ...) VISIT_STRUCT_EXPAND(M(__VA_ARGS__))
#define MACRO_MAP(f, ...) VISIT_STRUCT_EXPAND(VISIT_STRUCT_APPLY_F_(VISIT_STRUCT_CONCAT(VISIT_STRUCT_APPLYF, VISIT_STRUCT_PP_NARG(__VA_ARGS__)), f, __VA_ARGS__))