nlib
|
Windows, Linux, FreeBSD, OS X, Cygwin及び任天堂の開発環境に対応したライブラリの集合です。
nlib
はWindows, Linux, FreeBSD, OS X, Cygwin及び任天堂の開発環境に対して同一のI/Fを利用したプログラミングが可能な、ユーザーランド上で動作するライブラリ群を提供することを目的として開発されています。 開発はsoftware centricに行われ、適切で現実的なコーディングルール(nlibのコーディングルール)と個別の開発環境からの独立性が確保されたI/Fと実装によって、複数の開発環境に対して同時並行的に高い品質と性能及び信頼性を維持しつつ行われることにフォーカスしています。Platform | Library types | Remarks | ||
---|---|---|---|---|
Windows | Visual Studio 2017 | 64bit | static library, DLL, 15.2 | |
Visual Studio 2015 | 64bit | static library, DLL | Update 3 | |
32bit | static library | |||
Visual Studio 2013 | 64bit | static library, DLL | Update 5, Express Edition is available | |
32bit | static library | |||
Cygwin | 64bit | static library | gcc 5.4.0, newlib, libstdc++ | |
Bash on Ubuntu on Windows | 64bit | shared library | Ubuntu 14.04 | |
Linux | Ubuntu 17.04 | 64bit | shared library | clang 4.0.0, glibc, libstdc++, https://atlas.hashicorp.com/xenji/ |
Ubuntu 16.04 LTS | 64bit | gcc 5.3.1, clang 3.8, glibc, libstdc++, https://atlas.hashicorp.com/bento/ | ||
Ubuntu 14.04 LTS | 64bit | gcc 4.8.4, clang 3.4, glibc, libstdc++, https://atlas.hashicorp.com/ubuntu/ | ||
32bit | ||||
CentOS 7 (v1704.01) | 64bit | gcc 4.8.5, glibc, libstdc++, https://atlas.hashicorp.com/centos/ | ||
Fedora 25 | 64bit | gcc 6.2.1, clang 3.8, glibc, libstdc++. https://atlas.hashicorp.com/fedora/ | ||
Alpine 3.5.1 | 64bit | gcc 6.2.1, musl libc, libstdc++, https://atlas.hashicorp.com/maier | ||
FreeBSD | FreeBSD 11.0 | 64bit | shared library | clang 3.8, BSD libc, libc++, https://atlas.hashicorp.com/bento/ |
macOS | macOS 10.12 (Sierra) | 64bit | shared library | Xcode 8.3.2 |
CTR | CTR-SDK 11.5 | 32bit | static library | CTR_SDK-11_5_2-20161105-ja.zip armcc_4_1_nintendo-b1454-20150227.zip |
Cafe | CafeSDK 2.13.01 | 32bit | static library | cafe_sdk-2_13_01-20150728.zip MULTI-5_3_26-20150918.zip |
nlib
のアップデートによるトラブルを回避するためにも役に立ちます。 そのような受け入れテストの作成にtesting
ライブラリを利用するのはよい考えです。 nn::nlib::testing
形式のテストコードとして記述してそれを報告に含めると迅速に修正されるかもしれません。├── bin │ └── cmake # Command-line tools ├── cmake # Common Cmake scripts ├── documents-ja(documents-en) │ └── API # Reference Manual │ ├── html # HTML version of the Reference Manual │ └── searchdata.xml # Search index ├── include # Include files (in `system/include` for Cafe) │ ├── nn │ │ └── nlib │ │ ├── exi │ │ ├── heap │ │ ├── msgpack │ │ │ └── jsonrpc │ │ ├── oss │ │ ├── simd │ │ ├── succinct │ │ ├── testing │ │ ├── threading │ │ └── unicode │ ├── lz4.h │ ├── lz4hc.h │ ├── lz4frame.h │ ├── sqlite3.h │ └── sqlite3ext.h ├── lib # Platform-specific library files (`system/lib` for Cafe, `libraries` for CTR) ├── samples # Source code for samples │ ├── cmake │ └── sources │ ├── exi │ ├── heap │ ├── misc │ ├── msgpack │ ├── oss │ ├── succinct │ └── testing └── setup ├── setup-bash-ubuntu-windows-tools.sh ├── setup-cygwin-tools.sh ├── setup-msvc-libraries.ps1 └── setup-osx-tools.sh
nlib_epochtime()
他) nlib_gen_random()
) nlib_thread
)およびその開始や合流他 nlib_mutex
) nlib_cond
) nlib_tls
) nlib_barrier
) nlib_once()
) nlib_rwlock
) nlib_condrwlock
) nlib_mq
) nlib_atomic_compare_exchange32()
他) nlib_debug_break()
, nlib_debug_backtrace()
他) nlib_getenv()
) nlib_fd_open()
他) strtol()
やstrtoll()
といったC標準関数を誤用しにくい形にラップした関数(nlib_strto_int32()
他) ctype.h
で定義されるC標準関数をロケールの影響を受けない形で実装した関数(nlib_isspace()
他) snprintf()
, snwprintf()
とその類似関数の環境毎の挙動の違いを抑制し、誤用しにくい形にした関数(nlib_snprintf()
他) nlib_swapendian_32()
他) nlib_crc32()
, nlib_crc32c()
) nlib_popcnt64()
他) InputStream
, OutputStream
を基底とする各種ストリームを扱うためのクラス群 MemoryInputStream
, MemoryOutputStream
) FileInputStream
, FileOutputStream
) Base64InputStream
, Base64OutputStream
) zlib
で圧縮されたデータの読み書き(ZlibInputStream
, ZlibOutputStream
) TextReader
, TextWriter
) BinaryReader
, BinaryWriter
) unicode::UnicodeNormalizer
) unicode::StringPrep
) libn
ライブラリで定義された型と関数のラッパクラス std::thread
に相当するクラス(threading::Thread
) std::future
, std::async
等に相当するクラスや関数(threading::Future
, threading::Async
) threading::ThreadPool
) Uri
) UriTemplate
) NativePathMapper
) threading::AsyncFileIo
) LockFreeInit()
) LockFreePipe
) LockFreeStack
) LockFreeQueue
) LockFreePriorityQueue
) LockFreeBroadcastQueue
) std::unique_ptr
代替クラス(UniquePtr
)。C++11ではstd::unique_ptr
にtypedef
される。 Singleton
, SimpleSingleton
) std::vector
類似クラス(Nlist
) Nflags
) HandleMaker
) nn::nlib
, nn::nlib::unicode
, nn::nlib::threading
です。nn::nlib::exi
です。nmalloc()
/nfree()
(とそれらを実装するheap::CachedHeap
, heap::CentralHeap
)は、多段のフリーリストを利用することでフラグメンテーションの抑制を行い、性能の劣化を抑えています。 また、小さいサイズのメモリの場合は各スレッド毎にキャッシュを保持することにより、ロックをかけずにメモリの割り当てと解放が可能になっていてマルチスレッドでの性能劣化を抑制しています。 フリーリスト内のポインタはマングルされているか割り当て状態がチェックされていて、外部からのメモリの書き換えによる不正利用が行いにくいように実装されています。nn::nlib::heap
及びグローバル名前空間(Cリンケージの関数)です。succinct
ライブラリは以下のものを含みます。 nn::nlib::succinct
です。msgpack
ライブラリは以下のものを含みます。 nn::nlib::msgpack
です。nn::nlib::testing
(googletestとの互換性のためtesting
名前空間にエイリアスされている)です。misc
ライブラリに依存します。nn::nlib::oss
及びグローバル名前空間(Cリンケージの関数)です。simd
ライブラリは、SSE4.2とNEONに両対応したコードを記述するためのライブラリです。nn::nlib::simd
です。nlib
の各ライブラリ間の依存関係は下図のようになります。
nlib
ではコンパイラの種類やバージョンによって、C++11の機能を利用してコンパイルされています。 以下にC++11の機能とnlib
で利用できる互換用マクロ等、及びC++11を利用してコンパイルされる コンパイラについて表にまとめておきます。 なお、clangについてはバージョンではなく__has_feature()
マクロ及び__has_include()
マクロによって判定されます。 C++11の機能 | 識別用マクロ | C++03互換用マクロやtypedef等 | Visual Studio | gcc |
---|---|---|---|---|
Rvalue references | NLIB_CXX11_RVALUE_REFERENCES | なし | 2010 | 4.3 |
Variadic templates | NLIB_CXX11_VARIADIC_TEMPLATES | なし | 2013 | 4.7 |
Static assertions | NLIB_CXX11_STATIC_ASSERTIONS | NLIB_STATIC_ASSERT() | 2010 | 4.3 |
Null pointer constant | NLIB_CXX11_NULL_POINTER_CONSTANT | nn::nlib::nullptr, nn::nlib::nullptr_t | 2010 | 4.6 |
Deleted functions | NLIB_CXX11_DEFAULTED_AND_DELETED_FUNCTIONS | NLIB_DISALLOW_COPY_AND_ASSIGN() | 2015 | 4.4 |
Explicit conversion operators | NLIB_CXX11_EXPLICIT_CONVERSION_OPERATORS | NLIB_SAFE_BOOL() | 2013 | 4.6 |
Alias templates | NLIB_CXX11_TEMPLATE_ALIAS | なし | 2013 | 4.7 |
constexpr | NLIB_CXX11_CONSTEXPR | NLIB_CEXPR | 2015 | 4.7 |
char16_t, char32_t | NLIB_CXX11_NEW_CHARACTER_TYPES | nlib_utf16_t, nlib_utf32_t | 2015 | 4.4 |
alignas | NLIB_CXX11_ALIGNMENT_SUPPORT | NLIB_ALIGNAS() | 2015 | 4.8 |
Explicit virtual overrides | NLIB_CXX11_EXPLICIT_VIRTUAL_OVERRIDES | NLIB_OVERRIDE | 2012 | 4.7 |
final | NLIB_CXX11_EXPLICIT_VIRTUAL_OVERRIDES | NLIB_FINAL | 2012 | 4.7 |
noexcept | NLIB_CXX11_NOEXCEPT | NLIB_NOEXCEPT | 2015 | 4.6 |
Range-based for | NLIB_CXX11_RANGE_BASED_FOR | なし | 2012 | 4.6 |
lambda | NLIB_CXX11_LAMBDAS | なし | 2012 | 4.7 |
Delegating constructors | NLIB_CXX11_DELEGATING_CONSTRUCTORS | なし | 2013 | 4.7 |
std::unique_ptr | NLIB_CXX11_UNIQUEPTR | nn::nlib::UniquePtr | 2013 | 4.7 |
#include <random> | NLIB_CXX11_STDLIB_RANDOM | なし | 2013 | 4.8 |
#include <chrono> | NLIB_CXX11_STDLIB_CHRONO | nn::nlib::DateTime との変換 | 2012 | 4.7 |
#include <atomic> | NLIB_CXX11_STDLIB_ATOMIC | NLIB_MEMORY_ORDER_SEQ_CST 等 | 2012 | 4.8 |
#include <array> | NLIB_CXX11_STDLIB_ARRAY | なし | 2012 | 4.5 |
#include <unordered_map> #include <unordered_set> | NLIB_CXX11_STDLIB_UNORDERED | なし | 2012 | 4.5 |
#include <tuple> | NLIB_CXX11_STDLIB_TUPLE | なし | 2012 | 4.5 |
nlib
のコーディングルールは、(最新の)Google C++ Style Guide(若干古いが日本語訳)に若干の変更と緩和を行ったものになっています。 コーディングルール | Google C++ Style Guide | nlib |
---|---|---|
行の長さ | 80 | 100 |
インデント | 2 | 4 |
パラメータの順序 | 入力が先で出力が後 | 出力が先で入力が後 |
デフォルト引数 | 原則として禁止 | 以下の場合以外では利用可能。
|
ファイル名 | file_name.cc | FileName.cpp(サンプルではfile_name.cpp) |
インクルードガード | 更に#pragma once をつける(Visual Studioでのコンパイル高速化のため) | |
Boostの利用 | ライブラリ本体では利用しない(テスト等では自由) | |
アクセサ関数名 | get_xyz() / set_xyz() | GetXyz() / SetXyz() |
参照型の引数 | 非const参照は禁止 | nlib では以下については例外的に非const参照を利用可能にしている
|
C++11の利用 | ヘッダ、及びソースコードはC++03のコンパイラでもコンパイルできるようにしておくこと。
| |
nullptr | C++11なら利用 | C++03が使われているうちは、原則としてnullptr_t やnullptr を使わないこと
|
constexpr | C++11なら利用 | 当分の間、constexpr の利用は自明なケース以外では見合わせること
|
コメント |
|
legal/copyright
, build/include_alpha
, whitespace/newline
による警告は抑制されている。 std::swap()
の利用に際してヘッダalgorithm
のインクルードは要求されないよう緩和している。 nlib
はclang-check
によるソースコードの検査にも対応しています。 cmakeでMakefileを生成すると、compile_commands.jsonというファイルが一緒に作成され、clang-checkはこれを利用して動作します。 nlib
で用いている設定が .clang-format
ファイル(clang3.5用です)としてnlib
のパッケージに含まれていて利用することが可能です。 まず、clang-format
で一括してソースコードの大まかな変換を行い、cpplint.py
でより細かい日常的なチェックを行うことをおすすめします。_MSC_FULL_VER
をチェックすること。 -Wstack-usage=65536
を利用し、スタックを使い過ぎないようにすること。 -fstack-protector
を利用すること。 cpplint.py
の警告をゼロにし、各種環境でのコンパイルとテストを通すことがnlib
の基本的なリリース基準になっています。Platform.h
で定義される関数の宣言や実装以外のコードは利用する可能性のある全環境でコンパイルできるコードで記述されている必要がある。ただしSIMD命令等によって機種別に最適化されたコードが含まれることは容認される。 NLIB_FINAL
, NLIB_OVERRIDE
等のマクロやtypedef
を利用してC++11の機能を安全に導入し、C++11やC++14以降への連続的な移行を可能にすること。 errno_t
とすること(https://www.jpcert.or.jp/sc-rules/c-dcl09-c.html)。nlib
を利用する側のコードがこれらを利用する場合を想定したコードを記述すること(例外安全性等)。 malloc()
, free()
等はnlib_malloc()
, nlib_free()
等を利用すること。 new
は、new (std::nothrow)
を利用すること。 nlib_printf()
に渡す文字列はnlib
内部でUTF-16に変換された上でWin32 APIに渡されている。 Nflags
)は例外 char
型が符号付きでも符号無しでも正常に動作するようにしておくこと。 signed
char
を用いれば明示的に符号付きの値として扱うことができる。 wchar_t
に関してはwchar_t
が16bitの場合はUTF-16として、32bitの場合はUTF-32としてサポートすること。 NLIB_WCHAR_SIZE
が2か4のいずれかに定義されるのでそれで判断することができる。 nlib_utf16_t
, UTF-32文字の型には nlib_utf32_t
を利用すること。 char16_t
, char32_t
のtypedef
となる。 nlib_strcplen_ex()
を使うことにより、validationを行いつつコードポイント数とバイト長を同時に求めることができる。更にSIMDがサポートされている場合にはこの動作をより高速に行うことができる。 NLIB_CXX11_RVALUE_REFERENCES
で切り分けられたコード内での定義の他に、C++03でも同等の機能を実現できるよう、以下のようなメンバ関数を定義しなければならない。 boost::move
のような素晴らしい手法も存在するが、結局完全な互換性は達成できないのでこの手法は利用しない。 type_traits
の利用は慎重に行うこと。C++11のこの機能はコンパイラやそのバージョンによってバグがあったり実装が抜けていたり、といったことがある。 nn/nlib/TypeTraits.h に一応のラップが行われているが、やむを得ない場合にのみ利用すること。 NLIB_DISALLOW_COPY_AND_ASSIGN()
を使うこと。 .h
形式のものをインクルードすること。理由は以下の2つ。 nn/nlib/Platform.h
はCコンパイラでコンパイル可能である必要があることから、xxx.h
形式のヘッダをインクルードする必要があるため、nlib内部でxxx.h
形式とcxxx
形式の両方の形式でインクルードすることに起因するコード上の混乱を抑制するため。 testing
ライブラリを利用することが可能である。 manual.h
というファイルを配置して、そこに記述すること。英語版のマニュアルの場合はmanual_en.h
である。こうすることで複数言語版を同じレポジトリで管理することができる。 CMakeLists.txt
から、cmake/common.cmake
および、cmake/import.nx_misc.cmake
などのCMakeサポート用スクリプトをインクルードして利用します。 samples/cmake/CMakeLists.txt
を参考にすることができます。 nlib
を利用する際によく遭遇する状況と対処法について説明します。nlib
はメモリの確保にはnew (std::nothrow)
を利用しています。 アプリケーション、又は他のライブラリでnew/delete
をオーバーロードする場合には、operator new(size_t, const std::nothrow_t&)
もオーバーロードする必要があります。 nlib
はmalloc, free
を直接使うことはしていません。代わりにnlib_malloc()
, nlib_free()
等を利用します。 これらの関数はweak関数として定義されていてユーザーが定義することで置き換え可能です。 cmake/common.cmake.win32
等のファイルにプラットフォーム毎のスイッチ等の定義が記述されています。 参考にしてください。nlib
を利用するプロジェクトの判断に委ねられます。 受け入れテストを記述しておくことで、そういった判断をより容易にすることができます。 ただし、サポートの対象となるのは最新版のみです。ご了承ください。nlib
を利用するプロジェクト側においてnlib
のパッケージを再構成、再パッケージを行いプロジェクト内においてのみ再配布することが認められています。nlib_printf()
の入力文字列はUTF-8である必要があります。nlib_byte_t
型を追加しました。この型は将来的にC++17のstd::byte
にtypedefされます。 kEnumName
のような書き方に統一していきます。ENUM_NAME
のような書き方は将来的に使えなくなります。 nlib_strcplen2
, nlib_popcnt(x)
, nlib_clz(x)
, nlib_ctz(x)
を削除しました。nlib_strcplen
, nlib_popcnt32(x)
, nlib_clz32(x)
, nlib_ctz32(x)
を利用してください。 msgpack::MpObject::Clone()
がconstメンバ関数に変更されています。 msgpack::MpWalker
でバイト列の最後に到達するとエラー状態になるバグを修正しました。 msgpack::JsonPatch
クラス及びmsgpack::JsonPatchBuilder
クラスを追加しました。JSON Patch(RFC 6902)をサポートします。 simd::i128arg
の定義が不必要に参照型になることがある問題を修正しました。 msgpack::GetMapItem()
に、非ヌル終端の文字列を用いてMpObjectKv
を取得することのできるオーバーロードを追加しました。 /Ob1
オプションが指定されるようになりました。インライン関数が展開されるようになります。 msgpack::MpObject::InsertArrayItem()
, msgpack::MpObject::RemoveArrayItem()
, msgpack::MpObject::RemoveMapItem()
を追加しました。 msgpack::MpObject::DigByJsonPointer()
, msgpack::MpObject::RemoveByJsonPointer()
を追加しました。JSON Pointer(RFC6901)をサポートします。 msgpack::MpObject
の比較(==演算子)のバグを修正しました。MpObject
のキーの並びのみが異なる場合に異なると判定されていました。 msgpack::MpObject::ResolveJsonPointer()
を追加しました。JSON Pointer(RFC6901)をサポートします。 nlib_utf16_t
, nlib_utf32_t
がC言語利用時においてもtypedef
されるようになりました。 nlib_utf8_t
を新たに追加しました。 utf16_t
, utf32_t
がdeprecatedになりました。これらの型は将来のリリースで削除されます。 msgpack::jsonrpc::JsonRpcRequest::Init()
がparams
を省略したリクエストを不正と判定する不具合を修正しました。 © 2012-2017 Nintendo Co., Ltd. All rights reserved.