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_