1 /*---------------------------------------------------------------------------*
2   Project:  Horizon
3   File:     util_CLibImpl.h
4 
5   Copyright (C)2009 Nintendo Co., Ltd.  All rights reserved.
6 
7   These coded instructions, statements, and computer programs contain
8   proprietary information of Nintendo of America Inc. and/or Nintendo
9   Company Ltd., and are protected by Federal copyright law.  They may
10   not be disclosed to third parties or copied or duplicated in any form,
11   in whole or in part, without the prior written consent of Nintendo.
12 
13   $Rev: 16709 $
14  *---------------------------------------------------------------------------*/
15 
16 /*! @file
17     @brief      C インタフェースを実装する為のユーティリティヘッダ
18 
19 */
20 
21 #ifndef NN_UTIL_DETAIL_UTIL_CLIBIMPL_H_
22 #define NN_UTIL_DETAIL_UTIL_CLIBIMPL_H_
23 
24 #include <nn/types.h>
25 #include <nn/util/util_StaticAssert.h>
26 #include <nn/util/util_TypeTraits.h>
27 
28 #ifdef __cplusplus
29     /*! @def        NN_EXTERN_C
30         @brief      外部リンケージを C で宣言します。
31     */
32     #define NN_EXTERN_C extern "C"
33     #define NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(cname, cppname, size, alignment_holder_type) \
34         typedef union cname \
35         { \
36             char buf[size]; \
37             alignment_holder_type alignment_holder; \
38             NN_STATIC_ASSERT((size) == sizeof(cppname) && ::nn::util::alignment_of<alignment_holder_type>::value == ::nn::util::alignment_of<cppname>::value); \
39         } cname
40 
41 #else
42     #define NN_EXTERN_C extern
43     #define NN_UTIL_DETAIL_CLIBIMPL_DEFINE_BUFFER_CLASS(cname, cppname, size, alignment_holder_type) \
44         typedef union cname \
45         { \
46             char buf[size]; \
47             alignment_holder_type alignment_holder; \
48         } cname
49 #endif
50 
51 #define NN_UTIL_DETAIL_CLIBIMPL_DEFINE_ABSTRACT_BUFFER_CLASS(name) typedef struct { bit8 dummy; } name;
52 
53 #define NN_UTIL_DETAIL_CLIBIMPL_DECLARE_CONVERSION(name, fromC, toC) \
54     NN_EXTERN_C toC* name(fromC*); \
55     NN_EXTERN_C const toC* name##Const(const fromC*)
56 
57 #define NN_UTIL_DETAIL_CLIBIMPL_DEFINE_CONVERSION(name, fromC, toC, fromCpp, toCpp) \
58     NN_EXTERN_C toC* name(fromC* p) { return reinterpret_cast<toC*>(static_cast<toCpp*>(reinterpret_cast<fromCpp*>(p))); } \
59     NN_EXTERN_C const toC* name##Const(const fromC* p) { return reinterpret_cast<const toC*>(static_cast<const toCpp*>(reinterpret_cast<const fromCpp*>(p))); }
60 
61 #endif
62 
63 /* @defgroup       page_for_c_users    C 言語用ラッパーについて
64     @brief			C 言語用ラッパーについて
65 
66     @{
67 
68 CTR-SDK の API は主に C++ で構成されています。
69 C++ の API は C のファイルから直接呼び出す事はできません。
70 
71 このため CTR-SDK では、C のソースファイルから C++ の API を 呼び出せるようにラッパー関数を用意しています。
72 
73     ミューテックスの例
74 
75 C++ でミューテックスを使う為には @ref nn::os::Mutex クラスを利用します。Mutex クラスは内部にミューテックスオブジェクトを保持しています。
76 
77 このクラスを C で利用する為のラッパー関数は以下のように nnosMutex~で始まる名前を持ちます。
78 またこれらの関数は C++ のメソッドと 1 対 1 の関係を持っています。
79 
80 @li @ref nnosMutexInitialize → @ref nn::os::Mutex::Initialize <br>
81 @li @ref nnosMutexLock       → @ref nn::os::Mutex::Lock <br>
82 @li @ref nnosMutexTryLock    → @ref nn::os::Mutex::TryLock <br>
83 @li @ref nnosMutexUnlock     → @ref nn::os::Mutex::Unlock <br>
84 @li @ref nnosMutexInitialize → @ref nn::os::Mutex::Initialize <br>
85 
86 C ラッパー関数の詳細が知りたい場合は、対応するクラスのメソッドの説明を参照して下さい。
87 
88 一方、C においてミューテックスオブジェクトを保持する型は @ref nnosMutex 構造体です。
89 この構造体は内部的にはクラスのインスタンスであり、C 言語からは中身を参照する事はできません。
90 
91 
92     一覧
93 
94 C 及び C++ でそれぞれ利用できるモジュールの一覧はモジュールのページを参照して下さい。
95 
96 <!-- また C の関数の一覧は<A HREF="globals.html">ファイルメンバ</A>のページをを参照して下さい。-->
97 
98 	@}
99 */
100