CDRCodable
所属分类:Swift编程
开发工具:Swift
文件大小:0KB
下载次数:0
上传日期:2024-01-30 21:16:23
上 传 者:
sh-1993
说明: 用于Swift“Codable”类型的OMG通用数据表示(CDR)编码器和解码器。
(An OMG Common Data Representation (CDR) encoder and decoder for Swift `Codable` types.)
文件列表:
Sources/CDRCodable/
Tests/CDRCodableTests/
LICENSE
Package.swift
# CDRCodable
![Build](https://github.com/DimaRU/CDRCodable/workflows/Build/badge.svg)
A [OMG Common Data Representation (CDR)](https://www.omg.org/spec/DDS-XTypes/) encoder and decoder for Swift `Codable` types.
Now can be used with [FastRTPSSwift](https://github.com/DimaRU/FastRTPSSwift), a Swift wrapper for eProsima [FastDDS](https://github.com/eProsima/Fast-DDS) library.
## Requirements
- Swift 5.6+
## Usage
### Encoding Messages
```swift
import CDRCodable
let encoder = CDREncoder()
let value = try! encoder.encode("hello")
// Data([6, 0, 0, 0, 0x68, 0x65, 0x6C, 0x6C, 0x6F, 0, 0, 0])
```
### Decoding Messages
```swift
import CDRCodable
let decoder = CDRDecoder()
let data = Data([3, 0, 0, 0, 1, 0, 2, 0, 3, 0])
let value = try! decoder.decode([Int16].self, from: data)
// [1, 2, 3]
```
## Installation
### Swift Package Manager
Add the CDRCodable package to your target dependencies in `Package.swift`:
```swift
import PackageDescription
let package = Package(
name: "YourProject",
dependencies: [
.package(
url: "https://github.com/DimaRU/CDRCodable",
from: "1.0.0"
),
]
)
```
Then run the `swift build` command to build your project.
## Supported IDL types
### 1. Primitive types
The following table shows the basic IDL types supported by CDRCodable and how they are mapped to Swift and C++11.
| Swift | C++11 | IDL |
| ------- | ----------- | ------------------ |
| Int8 | char | char |
| UInt8 | uint8\_t | octet |
| Int16 | int16\_t | short |
| UInt16 | uint16\_t | unsigned short |
| Int32 | int32\_t | long |
| UInt32 | uint32\_t | unsigned long |
| Int64 | int64\_t | long long |
| UInt64 | uint64\_t | unsigned long long |
| Float | float | float |
| Double | double | double |
| Float80 | long double | long double |
| Bool | bool | boolean |
| String | std::string | string |
### 2. Arrays
Static size arrays is not supported by CDRCodable directly and needed custom coding.
### 3. Sequences
CDRCodable supports sequences, which map between Swift Array and C++ std::vector container. The following table represents how the map between Swift, C++11 and IDL and is handled.
| Swift | C++11 | IDL |
| --------------- | ------------------------- | ----------------------------- |
| `Array` | `std::vector` | `sequence` |
| `Array` or `Data` | `std::vector` | `sequence` |
| `Array` | `std::vector` | `sequence` |
| `Array` | `std::vector` | `sequence` |
| `Array` | `std::vector` | `sequence` |
| `Array` | `std::vector` | `sequence` |
| `Array` | `std::vector` | `sequence` |
| `Array` | `std::vector` | `sequence` |
| `Array` | `std::vector` | `sequence` |
| `Array` | `std::vector` | `sequence` |
| `Array` | `std::vector`| `sequence` |
| `Array` | `std::vector` | `sequence` |
| `Array` | `std::vector`| `sequence` |
| Array\ | std::vector\ | sequence\ |
| Array\ or Data | std::vector\ | sequence\ |
| Array\ | std::vector\ | sequence\ |
| Array\ | std::vector\ | sequence\ |
| Array\ | std::vector\ | sequence\ |
| Array\ | std::vector\ | sequence\ |
| Array\ | std::vector\ | sequence\ |
| Array\ | std::vector\ | sequence\ |
| Array\ | std::vector\ | sequence\ |
| Array\ | std::vector\ | sequence\ |
| Array\ | std::vector\ | sequence\ |
| Array\ | std::vector\ | sequence\ |
| Array\ | std::vector\ | sequence\ |
### 4. Enumerations
| Swift | IDL |
|:-------------- |:-------|
| enum e: Int32 | enum e |
Example:
IDL definition:
```IDL
enum ESubsystemState
{
UNKNOWN = 0,
INITIALIZED = 1,
POSTING = 2,
ACTIVE = 3,
STANDBY = 4,
RECOVERY = 5,
DISABLED = 6
};
```
Swift:
```Swift
enum ESubsystemState: Int32, Codable {
case unknown = 0
case initialized = 1
case posting = 2
case active = 3
case standby = 4
case recovery = 5
case disabled = 6
}
```
### 5. Union
Union type is not supported by CDRCodable directly and needed custom coding.
Example:
IDL definition:
```IDL
union ControlUnion switch (unsigned long)
{
case CONTROL_TYPE_S8:
char value_int8;
case CONTROL_TYPE_S16:
short value_int16;
case CONTROL_TYPE_S32:
long value_int32;
case CONTROL_TYPE_S64:
long long value_int64;
case CONTROL_TYPE_U8:
octet value_uint8;
case CONTROL_TYPE_U16:
unsigned short value_uint16;
case CONTROL_TYPE_U32:
unsigned long value_uint32;
case CONTROL_TYPE_U64:
unsigned long long value_uint64;
case CONTROL_TYPE_BITMASK:
unsigned long value_bitmask;
case CONTROL_TYPE_BUTTON:
boolean value_button;
case CONTROL_TYPE_BOOLEAN:
boolean value_boolean;
case CONTROL_TYPE_STRING:
string<128> value_string;
case CONTROL_TYPE_STRING_MENU:
unsigned long value_string_menu;
case CONTROL_TYPE_INT_MENU:
unsigned long value_int_menu;
};
```
Swift
```Swift
enum ControlUnion: Codable {
case S8(value: Int8)
case S16(value: Int16)
case S32(value: Int32)
case S64(value: Int64)
case U8(value: UInt8)
case U16(value: UInt16)
case U32(value: UInt32)
case U64(value: UInt64)
case Bitmask(bitmask: UInt32)
case Button(button: Bool)
case Boolean(value: Bool)
case StringValue(value: String)
case StringMenu(stringMenu: UInt32)
case IntMenu(intMenu: UInt32)
init(from decoder: Decoder) throws {
var container = try decoder.unkeyedContainer()
let selector = try container.decode(UInt32.self)
switch selector {
case 0:
let value = try container.decode(Int8.self)
self = .S8(value: value)
case 1:
let value = try container.decode(Int16.self)
self = .S16(value: value)
case 2:
let value = try container.decode(Int32.self)
self = .S32(value: value)
case 3:
let value = try container.decode(Int64.self)
self = .S64(value: value)
case 4:
let value = try container.decode(UInt8.self)
self = .U8(value: value)
case 5:
let value = try container.decode(UInt16.self)
self = .U16(value: value)
case 6:
let value = try container.decode(UInt32.self)
self = .U32(value: value)
case 7:
let value = try container.decode(UInt64.self)
self = .U64(value: value)
case 8:
let value = try container.decode(UInt32.self)
self = .Bitmask(bitmask: value)
case 9:
let value = try container.decode(Bool.self)
self = .Button(button: value)
case 10:
let value = try container.decode(Bool.self)
self = .Boolean(value: value)
case 11:
let value = try container.decode(String.self)
self = .StringValue(value: value)
case 12:
let value = try container.decode(UInt32.self)
self = .StringMenu(stringMenu: value)
case 13:
let value = try container.decode(UInt32.self)
self = .IntMenu(intMenu: value)
default:
let error = DecodingError.dataCorruptedError(in: container, debugDescription: "Illegal union selector \(selector)")
throw error
}
}
func encode(to encoder: Encoder) throws {
var container = encoder.singleValueContainer()
let selector: UInt32
switch self {
case .S8 : selector = 0
case .S16 : selector = 1
case .S32 : selector = 2
case .S64 : selector = 3
case .U8 : selector = 4
case .U16 : selector = 5
case .U32 : selector = 6
case .U64 : selector = 7
case .Bitmask : selector = 8
case .Button : selector = 9
case .Boolean : selector = 10
case .StringValue : selector = 11
case .StringMenu : selector = 12
case .IntMenu : selector = 13
}
try container.encode(selector)
switch self {
case .S8(value: let value): try container.encode(value)
case .S16(value: let value): try container.encode(value)
case .S32(value: let value): try container.encode(value)
case .S64(value: let value): try container.encode(value)
case .U8(value: let value): try container.encode(value)
case .U16(value: let value): try container.encode(value)
case .U32(value: let value): try container.encode(value)
case .U64(value: let value): try container.encode(value)
case .Bitmask(bitmask: let bitmask): try container.encode(bitmask)
case .Button(button: let button): try container.encode(button)
case .Boolean(value: let value): try container.encode(value)
case .StringValue(value: let value): try container.encode(value)
case .StringMenu(stringMenu: let stringMenu): try container.encode(stringMenu)
case .IntMenu(intMenu: let intMenu): try container.encode(intMenu)
}
}
}
```
### 6. Struct
`struct` may be coded as Swift `struct` or `class`.
Example:
IDL definition:
```IDL
struct TridentControlTarget
{
string id;
float pitch;
float yaw;
float thrust;
float lift;
};
```
```Swift
struct TridentControlTarget: Codable
{
let id: String
let pitch: Float
let yaw: Float
let thrust: Float
let lift: Float
}
```
## License
MIT
近期下载者:
相关文件:
收藏者: