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
// En una compilación amalgamada, no queremos ninguna anotación de exportación/importación.
9
#if defined(FTXUI_AMALGAMATED)
10
#define FTXUI_EXPORT(component)
11
#define INSIDE_FTXUI_COMPONENT_IMPL(component) 0
12
#else
13
14
// Se usa para anotar símbolos que son exportados por el componente llamado
15
// |component|. Tenga en cuenta que esto solo funciona correctamente si las fuentes del
16
// objetivo del componente correspondiente se compilan con |IS_FTXUI_$component_IMPL|
17
// definido como 1. Por ejemplo:
18
//
19
// class FTXUI_EXPORT(FOO) Bar {};
20
//
21
// Si IS_FTXUI_FOO_IMPL=1 en tiempo de compilación, entonces Bar se anotará usando la
22
// macro FTXUI_EXPORT_ANNOTATION definida más abajo. De lo contrario se
23
// anotará usando 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
// Indica si la unidad de compilación actual se está compilando como parte de
29
// la implementación del componente llamado |component|. Se expande a |1| si
30
// |IS_FTXUI_$component_IMPL| está definido como |1|; se expande a |0| en caso contrario.
31
//
32
// Nótese en particular que si |IS_FTXUI_$component_IMPL| no está definido en absoluto,
33
// sigue siendo correcto probar INSIDE_FTXUI_COMPONENT_IMPL(component), que
34
// se expande a |0| como se espera.
35
#define INSIDE_FTXUI_COMPONENT_IMPL(component) \
36
FTXUI_MACRO_CONDITIONAL_(IS_FTXUI_##component##_IMPL, 1, 0)
37
38
#endif
39
40
// Macros específicas del compilador para anotar exportación o importación de un símbolo. No hace nada
41
// en compilaciones que no son de componentes. No deberían usarse mucho directamente.
42
// En su lugar, use la macro FTXUI_EXPORT definida anteriormente.
43
#if defined(COMPONENT_BUILD)
44
#if defined(WIN32)
45
#define FTXUI_EXPORT_ANNOTATION __declspec(dllexport)
46
#define FTXUI_IMPORT_ANNOTATION __declspec(dllimport)
47
#else
// defined(WIN32)
48
#define FTXUI_EXPORT_ANNOTATION __attribute__((visibility("default")))
49
#define FTXUI_IMPORT_ANNOTATION __attribute__((visibility("default")))
50
#endif
// defined(WIN32)
51
#else
// defined(COMPONENT_BUILD)
52
#define FTXUI_EXPORT_ANNOTATION
53
#define FTXUI_IMPORT_ANNOTATION
54
#endif
// defined(COMPONENT_BUILD)
55
56
// Debajo de este punto hay varias macros de utilidad internas usadas para la
57
// implementación de las macros anteriores. No están destinadas a uso externo.
58
59
#define FTXUI_MACRO_EXPAND(x) x
60
61
// Ayudante para expansión condicional a una de dos cadenas de tokens. Si |condition|
62
// se expande a |1| entonces esta macro se expande a |consequent|; de lo contrario se expande
63
// a |alternate|.
64
#define FTXUI_MACRO_CONDITIONAL_(condition, consequent, alternate) \
65
FTXUI_MACRO_EXPAND(FTXUI_MACRO_SELECT_THIRD_ARGUMENT_( \
66
FTXUI_MACRO_CONDITIONAL_COMMA_(condition), consequent, alternate))
67
68
// Se expande a una coma (,) si su primer argumento se expande a |1|. Se usa en
69
// conjunto con |FTXUI_MACRO_SELECT_THIRD_ARGUMENT_()|, ya que la presencia
70
// o ausencia de una coma extra se puede usar para desplazar condicionalmente las
71
// posiciones de los argumentos siguientes y así influir en qué argumento se selecciona.
72
#define FTXUI_MACRO_CONDITIONAL_COMMA_(...) \
73
FTXUI_MACRO_EXPAND(FTXUI_MACRO_CONDITIONAL_COMMA_IMPL_(__VA_ARGS__, dummy))
74
#define FTXUI_MACRO_CONDITIONAL_COMMA_IMPL_(x, ...) \
75
FTXUI_MACRO_CONDITIONAL_COMMA_##x##_
76
#define FTXUI_MACRO_CONDITIONAL_COMMA_1_ ,
77
78
// Ayudante que simplemente selecciona su tercer argumento. Se usa en conjunto con
79
// |FTXUI_MACRO_CONDITIONAL_COMMA_()| arriba para implementar la expansión
80
// condicional de macros.
81
#define FTXUI_MACRO_SELECT_THIRD_ARGUMENT_(...) \
82
FTXUI_MACRO_EXPAND( \
83
FTXUI_MACRO_SELECT_THIRD_ARGUMENT_IMPL_(__VA_ARGS__, dummy))
84
#define FTXUI_MACRO_SELECT_THIRD_ARGUMENT_IMPL_(a, b, c, ...) c
85
86
#endif
// FTXUI_UTIL_EXPORT_H_