ラッパーライブラリ(またはライブラリラッパー)は、ライブラリの既存のインターフェースを互換性のあるインターフェースに変換する薄いコード層(「シム」)で構成されています。これにはいくつかの理由があります。
ラッパーライブラリは、アダプタ、ファサード、そして程度は低いもののプロキシ設計パターンを使用して実装できます。
ラッパーライブラリの具体的な実装方法は、それが開発される環境や、対象とするシナリオによって大きく異なります。特に、言語間/実行時間の相互運用性が考慮される場合は、この傾向が顕著になります。
以下は、C POSIX ライブラリヘッダー<pthread.h> (POSIX スレッド、または「pthreads 」用)に対する一般的なラッパーライブラリの実装例です。この例では、C++インターフェースがCインターフェースの「ラッパー」として機能します。
<pthread.h>内:
#include <sys/types.h>// 以前の宣言... int pthread_mutex_init ( pthread_mutex_t * mutex , const pthread_mutexattr_t * attr ); int pthread_mutex_destroy ( pthread_mutex_t * mutex ); int pthread_mutex_lock ( pthread_mutex_t * mutex ); int pthread_mutex_unlock ( pthread_mutex_t * mutex ); // その他の関数...<pthread.h> をPosixThread.cppmでラップしています:
export module org.posix.PosixThread ;import < pthread . h > ;export namespace org :: posix {// 以前のラッパー...class ThreadMutex { private : :: pthread_mutex_t mutex ;フレンドクラスThreadLock ;void lock () noexcept { :: pthread_mutex_lock ( & mutex ); }void unlock () noexcept { :: pthread_mutex_unlock ( & mutex ); } public : ThreadMutex () { :: pthread_mutex_init ( & mutex , 0 ); }~ ThreadMutex () { :: pthread_mutex_destroy ( & mutex ); } };class ThreadLock { private : ThreadMutex & mutex ; public : explicit ThreadLock ( ThreadMutex & mutex ) : mutex { mutex } { mutex.lock ( ) ; }~ ThreadLock () { mutex . unlock (); } };// その他のラッパー...}元のCインターフェースは、特にライブラリのユーザーが既にロックされているミューテックスのロックを解除し忘れた場合などに、エラーが発生しやすいと言えます。新しいインターフェースでは、新しいクラスとクラスでリソース取得初期化(RAII)を効果的に利用し、ミューテックスが最終的にロック解除され、オブジェクトが自動的に解放されるようにしています。org::posix::ThreadMutexorg::posix::ThreadLockorg::posix::ThreadMutexpthread_mutex_t
上記のコードは、 Boost.Threadライブラリの一部であるBoostのクラスboost::scoped_lockの実装を忠実に模倣しています。boost::mutex
ラッパーライブラリの中には、クライアントアプリケーションと、互換性のない技術で記述されたライブラリとの間の橋渡し役として機能するものがあります。例えば、Javaアプリケーションがシステムコールを実行する必要がある場合があります。しかし、システムコールは通常、Cライブラリ関数として公開されています。この問題を解決するために、JavaはこれらのシステムコールをJavaアプリケーションから呼び出し可能にするラッパーライブラリを実装しています。
これを実現するために、Javaなどの言語は、外部関数インターフェースと呼ばれるメカニズムを提供しており、これを可能にします。これらのメカニズムの例としては、以下のようなものがあります。
std::ffi(さび)既存のラッパーライブラリの例をいくつか挙げます。