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// 統合ビルドでは、export/importアノテーションは必要ありません。
9#if defined(FTXUI_AMALGAMATED)
10#define FTXUI_EXPORT(component)
11#define INSIDE_FTXUI_COMPONENT_IMPL(component) 0
12#else
13
14// |component|という名前のコンポーネントによってエクスポートされる
15// シンボルに注釈を付けるために使用されます。これが正しく機能するのは、
16// 対応するコンポーネントターゲットのソースが|IS_FTXUI_$component_IMPL|を
17// 1として定義してコンパイルされている場合のみであることに注意してください。
18// 例えば:
19//
20// class FTXUI_EXPORT(FOO) Bar {};
21//
22// コンパイル時にIS_FTXUI_FOO_IMPL=1であれば、Barは以下で定義される
23// FTXUI_EXPORT_ANNOTATIONマクロを使用して注釈付けされます。そうでない場合は
24// FTXUI_IMPORT_ANNOTATIONマクロを使用して注釈付けされます。
25#define FTXUI_EXPORT(component) \
26 FTXUI_MACRO_CONDITIONAL_(IS_FTXUI_##component##_IMPL, \
27 FTXUI_EXPORT_ANNOTATION, FTXUI_IMPORT_ANNOTATION)
28
29// 現在のコンパイル単位が、|component|という名前のコンポーネントの実装の
30// 一部としてコンパイルされているかどうかを示します。|IS_FTXUI_$component_IMPL|
31// が|1|として定義されている場合は|1|に展開され、そうでない場合は|0|に
32// 展開されます。
33//
34// 特に、|IS_FTXUI_$component_IMPL|がまったく定義されていない場合でも、
35// INSIDE_FTXUI_COMPONENT_IMPL(component)をテストしても問題なく、
36// 期待通り|0|に展開されることに注意してください。
37#define INSIDE_FTXUI_COMPONENT_IMPL(component) \
38 FTXUI_MACRO_CONDITIONAL_(IS_FTXUI_##component##_IMPL, 1, 0)
39
40#endif
41
42// シンボルのエクスポートまたはインポートに注釈を付けるためのコンパイラ
43// 固有のマクロ。非コンポーネントビルドではノーオペレーションです。
44// これらは直接使用されることはほとんどないはずです。代わりに上記で
45// 定義されているFTXUI_EXPORTマクロを使用してください。
46#if defined(COMPONENT_BUILD)
47#if defined(WIN32)
48#define FTXUI_EXPORT_ANNOTATION __declspec(dllexport)
49#define FTXUI_IMPORT_ANNOTATION __declspec(dllimport)
50#else // defined(WIN32)
51#define FTXUI_EXPORT_ANNOTATION __attribute__((visibility("default")))
52#define FTXUI_IMPORT_ANNOTATION __attribute__((visibility("default")))
53#endif // defined(WIN32)
54#else // defined(COMPONENT_BUILD)
55#define FTXUI_EXPORT_ANNOTATION
56#define FTXUI_IMPORT_ANNOTATION
57#endif // defined(COMPONENT_BUILD)
58
59// この時点以降は、上記のマクロの実装に使用されるいくつかの内部
60// ユーティリティマクロです。外部使用を意図していません。
61
62#define FTXUI_MACRO_EXPAND(x) x
63
64// 2つのトークン文字列のいずれかへの条件付き展開のためのヘルパー。
65// |condition|が|1|に展開される場合、このマクロは|consequent|に展開され、
66// そうでない場合は|alternate|に展開されます。
67#define FTXUI_MACRO_CONDITIONAL_(condition, consequent, alternate) \
68 FTXUI_MACRO_EXPAND(FTXUI_MACRO_SELECT_THIRD_ARGUMENT_( \
69 FTXUI_MACRO_CONDITIONAL_COMMA_(condition), consequent, alternate))
70
71// 最初の引数が|1|に展開される場合にのみコンマ(,)に展開されます。
72// |FTXUI_MACRO_SELECT_THIRD_ARGUMENT_()|と組み合わせて使用され、
73// 余分なコンマの有無を使用して後続の引数位置を条件付きでシフトさせ、
74// どの引数が選択されるかに影響を与えることができます。
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// 単純に3番目の引数を選択するヘルパー。上記の
82// |FTXUI_MACRO_CONDITIONAL_COMMA_()|と組み合わせて条件付きマクロ展開を
83// 実装するために使用されます。
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_