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 | Version 15.7.27703.2026 |
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 7.3.0, newlib, libstdc++ | |
Windows Subsystem for Linux | 64bit | shared library | Ubuntu 16.04, gcc 5.4.0, clang 3.8.0 | |
Linux | Ubuntu 18.04 | 64bit | shared library | gcc 7.3.0, clang 6.0.0, glibc, libstdc++, ubuntu/bionic64 (virtualbox, 20180531.0.0) |
Ubuntu 16.04 LTS | 64bit | gcc 5.3.1, clang 3.8, glibc, libstdc++, bento/ubuntu-16.04 (virtualbox, 201803.24.0) | ||
CentOS 7 | 64bit | devtoolset-4, gcc 5.3.1, glibc, libstdc++, centos/7 (virtualbox, 1804.02) | ||
Fedora 28 | 64bit | gcc 8.0.1, clang 6.0.0, glibc, libstdc++. fedora/28-cloud-base (virtualbox, 20180425) | ||
Alpine 3.6.2 | 64bit | gcc 6.3.0, musl libc, libstdc++, maier/alpine-3.6-x86_64 (virtualbox, 3.6.2) | ||
FreeBSD | FreeBSD 11.1 | 64bit | shared library | clang 4.0, BSD libc, libc++, freebsd/FreeBSD-11.1-STABLE (virtualbox, 2018.04.12) |
macOS | macOS 10.13 (High Sierra) | 64bit | shared library | Xcode 9.4 |
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_27-20170829.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 # Development environment setup scripts
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
) 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/14/17の機能を利用してコンパイルされています。 コンパイラがそれらの機能をサポートしているかどうかは、コンパイラのバージョンやC++14から推奨となったFeature Testing Macrosを用いて判断しています。 C++11の機能 | 識別用マクロ | C++03互換用マクロやtypedef等 | Vi | |
---|---|---|---|---|
Rvalue references | __cpp_rvalue_references | なし | 2010 | 4.3 |
Variadic templates | __cpp_variadic_templates | なし | 2013 | 4.7 |
Static assertions | __cpp_static_assert | 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 | __cpp_alias_templates | なし | 2013 | 4.7 |
constexpr | __cpp_constexpr | NLIB_CEXPR | 2015 | 4.7 |
char16_t, char32_t | __cpp_unicode_characters | 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 | __cpp_range_based_for | なし | 2012 | 4.6 |
lambda | __cpp_lambdas | なし | 2012 | 4.7 |
Delegating constructors | __cpp_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 |
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 の利用は自明なケース以外では見合わせること
|
コメント |
|
.clang-format
が配置されていて、適宜アップデートされます。_MSC_FULL_VER
をチェックすること。 -Wstack-usage=65536
を利用し、スタックを使い過ぎないようにすること。 -fstack-protector
を利用すること。 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がサポートされている場合にはこの動作をより高速に行うことができる。 __cpp_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
をインクルードし、FIND_PACKAGE()
でnlib内のライブラリを組み込んで利用します。 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である必要があります。oss
ライブラリに含まれるSQLite3をバージョン3.24.0にアップデートしました。 JsonPatch::Apply()
失敗した場合のロールバックに失敗する不具合を修正しました。 oss
ライブラリでoss::BsDiffZ()
とoss::BsPatchZ()
のconstnessの修正を行いました。 oss
ライブラリでoss::BsDiffZ()
がデバッグビルドでは再帰によるスタック溢れを起こすことがある不具合を修正しました。 succinct
ライブラリのsuccinct::AhoCorasickBuilder
が登録語によっては間違った変換を行う場合がある不具合の修正を行いました。 succinct
ライブラリのsuccinct::SparseSet
の稀なケースでの不具合を修正しました。 succinct
ライブラリのsuccinct::Trie::GetCommomPrefixWords()
の稀なケースでの不具合を修正しました。 succinct
ライブラリのsuccinct::Bp::Init()
に対して根が複数あるツリーを渡した場合に変換に失敗するようにしました。 succinct
ライブラリの一部クラスでExport()
後にImport
を行うとメモリリークする場合がある不具合を修正しました。 misc
ライブラリのUri::operator==()
, Uri::operator!=()
がWindowsのDLL版でexportされていない不具合を修正しました。 misc
ライブラリのNlist::resize()
において、要素がtrivially constructibleな場合の不具合を修正しました。 misc
ライブラリのUri::Parse()
が指定された範囲を1バイト外れてアクセスすることがある不具合を修正しました。 nlib_find_break
を追加しました。 InputStream
にInputStream::Mark()
, InputStream::GoBackToMark()
, InputStream::IsMarkSupported()
を追加しました。 oss
ライブラリに含まれるSQLite3をバージョン3.23.1にアップデートしました。 oss
ライブラリに含まれるLZ4をバージョン1.8.2にアップデートしました。 unicode::UnicodeNormalizer
を削除しました。 unicode::StringPrep
を削除しました。 msgpack::MpObject
のムーブ時にメモリリークすることがある不具合を修正しました。 nlib_get_unicode_char_property()
, nlib_case_mapping()
,nlib_case_folding()
, nlib_nfkc()
, nlib_nfkc_case_folding()
を追加しました。Unicode 10.0.0を反映しています。 oss
ライブラリに含まれるSQLite3をバージョン3.23.0にアップデートしました。 unicode::UnicodeNormalizer
がdeprecatedになりました。nlib_nfkc()
, nlib_nfkc_case_folding()
を利用してください。 unicode::StringPrep
がdeprecatedになりました。 __STDC_FORMAT_MACROS
未定義時の警告を無くしました。C11ではこのマクロを定義する必要はなくなったためです。 nlib_memutf8_to_utf32char()
を追加しました。 simd::I128::SumUint8()
及びsimd::I128::SumUint16()
を追加しました。 std::pair
及びstd::tuple
を用いてエラー値と共に結果を返すオーバーロードを追加しました。 Nlist<int>
を構築直後にリサイズするとクラッシュする不具合を修正しました。 JsonStreamParser::ToFloat()
でdouble型の結果を変換した場合、正しい値を返さない不具合を修正しました。 JsonPatch::Apply()
失敗後のロールバックに失敗する不具合を修正しました。 oss
ライブラリに含まれるSQLite3をバージョン3.22.0にアップデートしました。 oss
ライブラリに含まれるLZ4をバージョン1.8.1.2にアップデートしました。 © Nintendo Co., Ltd. All rights reserved.