# MWXライブラリについて

MWX ライブラリは、TWELITE モジュールのプログラムをより容易にかつ拡張性を高めるために設計されています。これまでMWSDKで利用していた TWENET C ライブラリを基本とし、MWXライブラリはアプリケーション開発層のライブラリとして開発しております。

```
   Act (USER APPs)... 
+-----------------------+
| MWX C++ LIB           |
+---------------+       |
| TWENET C LIB  |       |
+------------+----------+
| MAC LAYER  | AHI APIs |
+-----------------------+
| TWELITE HARDWARE      |
+-----------------------+
```

MWX ライブラリの名称は Mono Wireless C++ Library for TWELITE です。MW は MonoWireless から、また C++ -> CXX -> double X -> WX。この MW と WX を重ねて MWX になりました。

このライブラリを用いて記述したコードを「**アクト(act)**」と呼びます。

###

### 表記等について

本解説での表記について記載します。

#### auto&&

ユニバーサル参照と呼ばれ、標準ライブラリなどで良く用いられます。当ライブラリでもほとんどの場合`auto&&` と記載します。

{% hint style="info" %}
`auto` はC言語ではローカル変数（自動変数）を宣言する際のキーワードとなっていますが、ここでは型推論により宣言を行う意味です。C++のテンプレート構文では非常に煩雑な型名になることが多く、同時に型名を明示的に記述しなくても実装できる場面で便利な記法です。

下記の例では、`v`の型に対する最大値最小値を発見する標準ライブラリのアルゴリズム `std::minmax_element` を用いた例で、結果の戻り値を `auto`により宣言しています。この場合、autoで推論された型は`std::pair<int, int>`になります。

```cpp
#include <algorithm>
int v[] = { 1, 3, -1, 5, 10 };
auto&& result = std::minmax_element(std::begin(v), std::end(v));
Serial << "min=" << int(result.first)
       << ",max=" << int(result.second);
```

`auto &&`の`&&`ついては、厳格な意味合いは専門書籍などを紐解いていただく必要がありますが、ここでは「戻りが参照型（C言語でいうポインタ渡しに近い）であっても値であっても、気にせず宣言できる」とお考え下さい。
{% endhint %}

#### 名前空間について

`namespace, inline namespace, using` を用いて、名前の再定義などを行っています。解説中でも一部省略して記載しています。

### 制限事項 (TWENET)

MWXライブラリは、下層に位置する各ライブラリ・機能（TWNET Cライブラリでの機能、また半導体ベンダが提供するマイコン・ペリフェラル機能、IEEE802.15.4の機能）について、その全てに対応する目的では開発しておりません。

### 制限事項 (C++の利用)

MWXライブラリはC++言語で記述されておりアクトの記述においても C++ での記述を行うことになります。しかしながらC++言語であってもすべての機能が使えるわけではありません。特に以下の点に注意してください。

* `new, new[]` 演算子でのメモリ確保は行えますが、確保したメモリを破棄することはできません。C++ライブラリで動的メモリ確保をするものは殆どが事実上利用不可能です。
* グローバルオブジェクトのコンストラクタが呼び出されません。\
  参考：必要な場合は、初期化関数(`setup()`) で `new ((void*)&obj_global) class_foo();` のように初期化することでコンストラクタの呼び出しを含めた初期化を行えます。
* 例外 `exception`が使用できません。
* 仮想関数 `virtual` が使用できません。
* 上記の制約があるためSTLなどC++標準ライブラリの一部のみの利用となります。

※ 当社で把握しているものについての記載です。

{% hint style="warning" %}
標準ライブラリについては利用可否、また利用できそうなものについての包括的な検証は行っておりません。動作の不都合が確認できた場合は、別の方法で実装するようにしてください。
{% endhint %}

### ライブラリのソースコードについて

ソースコードは以下から参照できます。

* `{MWSDKインストールディレクトリ}/TWENET/current/src/mwx`
* [`https://github.com/monowireless/mwx`](https://github.com/monowireless/mwx)
