FTXUI
7.0.3
C++ functional terminal UI.
Loading...
Searching...
No Matches
export.hpp
Go to the documentation of this file.
1
// Copyright 2026 Arthur Sonzogni. All rights reserved.
2
// Use of this source code is governed by the MIT license that can be found in
3
// the LICENSE file.
4
5
#ifndef FTXUI_UTIL_EXPORT_H_
6
#define FTXUI_UTIL_EXPORT_H_
7
8
// Dans un build amalgamé, on ne veut aucune annotation d'export/import.
9
#if defined(FTXUI_AMALGAMATED)
10
#define FTXUI_EXPORT(component)
11
#define INSIDE_FTXUI_COMPONENT_IMPL(component) 0
12
#else
13
14
// Utilisé pour annoter les symboles exportés par le composant nommé
15
// |component|. Notez que ceci ne fonctionne correctement que si les sources
16
// de la cible du composant correspondant sont compilées avec
17
// |IS_FTXUI_$component_IMPL| défini à 1. Par exemple :
18
//
19
// class FTXUI_EXPORT(FOO) Bar {};
20
//
21
// Si IS_FTXUI_FOO_IMPL=1 à la compilation, alors Bar sera annoté en utilisant
22
// la macro FTXUI_EXPORT_ANNOTATION définie ci-dessous. Sinon, il sera annoté
23
// en utilisant la macro FTXUI_IMPORT_ANNOTATION.
24
#define FTXUI_EXPORT(component) \
25
FTXUI_MACRO_CONDITIONAL_(IS_FTXUI_##component##_IMPL, \
26
FTXUI_EXPORT_ANNOTATION, FTXUI_IMPORT_ANNOTATION)
27
28
// Indique si l'unité de compilation actuelle est compilée dans le cadre de
29
// l'implémentation du composant nommé |component|. S'étend en |1| si
30
// |IS_FTXUI_$component_IMPL| est défini à |1| ; s'étend en |0| sinon.
31
//
32
// Notez en particulier que si |IS_FTXUI_$component_IMPL| n'est pas du tout
33
// défini, il reste correct de tester INSIDE_FTXUI_COMPONENT_IMPL(component),
34
// qui s'étend alors en |0| comme attendu.
35
#define INSIDE_FTXUI_COMPONENT_IMPL(component) \
36
FTXUI_MACRO_CONDITIONAL_(IS_FTXUI_##component##_IMPL, 1, 0)
37
38
#endif
39
40
// Macros spécifiques au compilateur pour annoter l'export ou l'import d'un
41
// symbole. Sans effet en dehors des builds par composant. Elles ne devraient
42
// pas être utilisées directement. Utilisez plutôt la macro FTXUI_EXPORT
43
// définie ci-dessus.
44
#if defined(COMPONENT_BUILD)
45
#if defined(WIN32)
46
#define FTXUI_EXPORT_ANNOTATION __declspec(dllexport)
47
#define FTXUI_IMPORT_ANNOTATION __declspec(dllimport)
48
#else
// defined(WIN32)
49
#define FTXUI_EXPORT_ANNOTATION __attribute__((visibility("default")))
50
#define FTXUI_IMPORT_ANNOTATION __attribute__((visibility("default")))
51
#endif
// defined(WIN32)
52
#else
// defined(COMPONENT_BUILD)
53
#define FTXUI_EXPORT_ANNOTATION
54
#define FTXUI_IMPORT_ANNOTATION
55
#endif
// defined(COMPONENT_BUILD)
56
57
// Au-delà de ce point se trouvent plusieurs macros utilitaires internes
58
// utilisées pour l'implémentation des macros ci-dessus. Non destinées à un
59
// usage externe.
60
61
#define FTXUI_MACRO_EXPAND(x) x
62
63
// Auxiliaire pour l'expansion conditionnelle vers l'une de deux chaînes de
64
// tokens. Si |condition| s'étend en |1| alors cette macro s'étend en
65
// |consequent| ; sinon elle s'étend en |alternate|.
66
#define FTXUI_MACRO_CONDITIONAL_(condition, consequent, alternate) \
67
FTXUI_MACRO_EXPAND(FTXUI_MACRO_SELECT_THIRD_ARGUMENT_( \
68
FTXUI_MACRO_CONDITIONAL_COMMA_(condition), consequent, alternate))
69
70
// S'étend en une virgule (,) si et seulement si son premier argument s'étend
71
// en |1|. Utilisé conjointement avec |FTXUI_MACRO_SELECT_THIRD_ARGUMENT_()|,
72
// car la présence ou l'absence d'une virgule supplémentaire peut être
73
// utilisée pour décaler conditionnellement les positions des arguments
74
// suivants et ainsi influencer l'argument sélectionné.
75
#define FTXUI_MACRO_CONDITIONAL_COMMA_(...) \
76
FTXUI_MACRO_EXPAND(FTXUI_MACRO_CONDITIONAL_COMMA_IMPL_(__VA_ARGS__, dummy))
77
#define FTXUI_MACRO_CONDITIONAL_COMMA_IMPL_(x, ...) \
78
FTXUI_MACRO_CONDITIONAL_COMMA_##x##_
79
#define FTXUI_MACRO_CONDITIONAL_COMMA_1_ ,
80
81
// Auxiliaire qui sélectionne simplement son troisième argument. Utilisé
82
// conjointement avec |FTXUI_MACRO_CONDITIONAL_COMMA_()| ci-dessus pour
83
// implémenter l'expansion conditionnelle de macro.
84
#define FTXUI_MACRO_SELECT_THIRD_ARGUMENT_(...) \
85
FTXUI_MACRO_EXPAND( \
86
FTXUI_MACRO_SELECT_THIRD_ARGUMENT_IMPL_(__VA_ARGS__, dummy))
87
#define FTXUI_MACRO_SELECT_THIRD_ARGUMENT_IMPL_(a, b, c, ...) c
88
89
#endif
// FTXUI_UTIL_EXPORT_H_