17. Adaptor
2015/5/29 17Copyright OGIS-RI 2015
https://github.com/msgpack/msgpack-c/wiki/v1_1_cpp_adaptor
C++ type msgpack::object type
bool bool
char* str
std::deque array
char positive/negative integer
signed ints *1 positive/negative integer
unsigned ints *2 positive integer
std::list array
std::map array
std::pair array
std::set array
std::string str
std::vector array
std::vector<char> bin
*1 signed ints signed char, signed short, signed int, signed long, signed long long
*2 unsigned ints unsigned char, unsigned short, unsigned int, signed long, signed long long
C++11 type
msgpack::
object type
std::array array
std::array<char> bin
std::forward_list array
std::tuple array
std::array array
std::unordered_map array
std::unordered_set array
boost type
msgpack::
object type
boost::optional<T> T
boost::string_ref str
23. APIのバージョニング
2015/5/29 23Copyright OGIS-RI 2015
Inline namespace
The inline namespace mechanism is intended to support library evolution by providing a mechanism that support a
form of versioning. Consider:
inline namespace V99 {
void f(int); // does something better than the V98 version
void f(double); // new feature
// ...
}
namespace V98 {
void f(int); // does something
// ...
}
namespace Mine {
#include "V99.h"
#include "V98.h"
}
We here have a namespace Mine with both the latest release (V99) and the previous one (V98). If you want to be
specific, you can:
#include "Mine.h"
using namespace Mine;
V98::f(1); // old version
V99::f(1); // new version
f(1); // default version
The point is that the inline specifier makes the declarations from the nested namespace appear exactly as if they had
been declared in the enclosing namespace.This is a very ``static'' and implementer-oriented facility in that the inline
specifier has to be placed by the designer of the namespaces -- thus making the choice for all users. It is not possible
for a user of Mine to say ``I want the default to be V98rather than V99.''
file V99.h
file V98.h
file Mine.h
http://www.stroustrup.com/C++11FAQ.html#inline-namespace
27. APIのバージョニング
2015/5/29 27Copyright OGIS-RI 2015
A
B
C
A
ABI変更
msgpack::B()
msgpack::C()
V1 V2
D
msgpack::D()
msgpack::B()
inline namespace
using v1::B
using V1::C
using v1::D
28. using v1::B
using V1::C
using v1::D
APIのバージョニング
2015/5/29 28Copyright OGIS-RI 2015
A
B
C
A
C
ABI変更
msgpack::B()
msgpack::C()
V1 V2 V3
D
msgpack::D()
msgpack::B()
inline namespace
msgpack::D() using v2::D
29. using v1::B
using V1::C
using v1::D
APIのバージョニング
2015/5/29 29Copyright OGIS-RI 2015
A
B
C
A
C
ABI変更
msgpack::B()
msgpack::C()
V1 V2 V3
D
msgpack::D()
msgpack::B()
inline namespace
msgpack::D() using v2::D
30. using v1::B
using V1::C
using v1::D
APIのバージョニング
2015/5/29 30Copyright OGIS-RI 2015
A
B'
C
A
C
ABI変更
msgpack::B()
msgpack::C()
V1 V2 V3
D
msgpack::D()
msgpack::B()
inline namespace
msgpack::D() using v2::D
CのABI変更対応
31. using v1::B
using V1::C
using v1::D
APIのバージョニング
2015/5/29 31Copyright OGIS-RI 2015
A
B'
C
A
C
ABI変更
msgpack::B()
msgpack::C()
V1 V2 V3
D
msgpack::D()
msgpack::B()
inline namespace
msgpack::D()
using v2::A
using v2::B
using v2::D
CのABI変更対応
B'のABIに変更が無ければこれでOK
32. using v1::B
using V1::C
using v1::D
APIのバージョニング
2015/5/29 32Copyright OGIS-RI 2015
A
B'
C
A
C
ABI変更
msgpack::B()
msgpack::C()
V1 V2 V3
D
msgpack::D()
msgpack::B()
inline namespace
msgpack::D()
using v2::A
using v2::B
using v2::D
B'のABIに変更が生じる場合
CのABI変更対応
33. using v1::B
using V1::C
using v1::D
APIのバージョニング
2015/5/29 33Copyright OGIS-RI 2015
A
B''
C
A
C
ABI変更
msgpack::B()
msgpack::v1::C()
V1 V2 V3
D
msgpack::D()
msgpack::B()
inline namespace
msgpack::バージョン名前空間:: 修飾することで
明示的に特定バージョンの名前空間を参照
msgpack::名前空間修飾することで inline namespaceを参照
msgpack::D() using v2::D
CのABI変更対応
をここでは行わない
34. using v1::B
using V1::C
using v1::D
APIのバージョニング
2015/5/29 34Copyright OGIS-RI 2015
A
B''
C
A
C
ABI変更
msgpack::B()
V1 V2 V3
D
msgpack::D()
Bmsgpack::B()
inline namespace
msgpack::v1::C()
msgpack::D()
msgpack::C()
using v2::D
CのABI変更対応
ABI変更
35. using v1::B
using V1::C
using v1::D
APIのバージョニング
2015/5/29 35Copyright OGIS-RI 2015
A
B''
C
A
C
ABI変更
msgpack::B()
V1 V2 V3
D
msgpack::D()
B
CのABI変更対応
msgpack::B()
inline namespace
msgpack::v1::C()
msgpack::D()
msgpack::C()
using v2::D
ABI変更
36. using v1::B
using V1::C
using v1::D
APIのバージョニング
2015/5/29 36Copyright OGIS-RI 2015
A'
B''
C
A'
C
ABI変更
msgpack::B()
V1 V2 V3
D
msgpack::D()
B
CのABI変更対応
msgpack::B()
inline namespace
msgpack::v1::C()
msgpack::D()
msgpack::C()
using v2::D
ABI変更
BのABI変更対応BのABI変更対応
37. using v1::B
using V1::C
using v1::D
APIのバージョニング
2015/5/29 37Copyright OGIS-RI 2015
A'
B''
C
A'
C
ABI変更
msgpack::B()
V1 V2 V3
D
msgpack::D()
B
CのABI変更対応
msgpack::B()
inline namespace
msgpack::v1::C()
msgpack::D()
msgpack::C()
using v2::A
using v2::D
ABI変更
BのABI変更対応BのABI変更対応
A'のABIに変更が無ければこれでOK
38. using v1::B
using V1::C
using v1::D
APIのバージョニング
2015/5/29 38Copyright OGIS-RI 2015
A''
B'
C
A''
C
ABI変更
V1 V2 V3
D
msgpack::D()
B
ABI変更対応
A
inline namespace
msgpack::v1::C()
msgpack::v1::B()
msgpack::v1::B()
msgpack::D()
msgpack::C()
msgpack::B()
using v1::D
A'のABIに変更がある場合