1875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar/*
2875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar * Copyright 2016 The Android Open Source Project
3875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar *
4875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar * Licensed under the Apache License, Version 2.0 (the "License");
5875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar * you may not use this file except in compliance with the License.
6875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar * You may obtain a copy of the License at
7875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar *
8875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar *      http://www.apache.org/licenses/LICENSE-2.0
9875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar *
10875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar * Unless required by applicable law or agreed to in writing, software
11875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar * distributed under the License is distributed on an "AS IS" BASIS,
12875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar * See the License for the specific language governing permissions and
14875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar * limitations under the License.
15875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar */
16875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
17875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar//#define LOG_NDEBUG 0
18875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar#define LOG_TAG "C2Param_test"
19875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
20875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar#include <gtest/gtest.h>
21875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
22875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar#include <util/C2ParamUtils.h>
23875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar#include <C2ParamDef.h>
24875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
25875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarnamespace android {
26875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
27875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarvoid PrintTo(const _C2FieldId &id, ::std::ostream* os) {
28875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    *os << "@" << id._mOffset << "+" << id._mSize;
29875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
30875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
31875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarvoid PrintTo(const C2FieldDescriptor &fd, ::std::ostream *os) {
32875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    using FD=C2FieldDescriptor;
33875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    switch (fd.type()) {
34875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    case FD::INT32: *os << "i32"; break;
35875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    case FD::INT64: *os << "i64"; break;
36875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    case FD::UINT32: *os << "u32"; break;
37875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    case FD::UINT64: *os << "u64"; break;
38875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    case FD::FLOAT: *os << "float"; break;
39875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    case FD::STRING: *os << "char"; break;
40875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    case FD::BLOB: *os << "u8"; break;
41875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    default:
42875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        if (fd.type() & FD::STRUCT_FLAG) {
43875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            *os << "struct-" << (fd.type() & ~FD::STRUCT_FLAG);
44875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        } else {
45875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            *os << "type-" << fd.type();
46875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
47875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
48875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    *os << " " << fd.name();
49875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    if (fd.length() > 1) {
50875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        *os << "[" << fd.length() << "]";
51875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    } else if (fd.length() == 0) {
52875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        *os << "[]";
53875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
54875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    *os << " (";
55875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    PrintTo(fd._mFieldId, os);
56875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    *os << "*" << fd.length() << ")";
57875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
58875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
59875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarenum C2ParamIndexType {
60875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    kParamIndexNumber,
61875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    kParamIndexNumbers,
62875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    kParamIndexNumber2,
63875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    kParamIndexVendorStart = C2Param::BaseIndex::kVendorStart,
64875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    kParamIndexVendorNumbers,
65875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
66875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
67875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarvoid ffff(int(*)(int)) {}
68875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
69875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar/* ============================= STRUCT DECLARATION AND DESCRIPTION ============================= */
70875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
71875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartypedef C2FieldDescriptor FD;
72875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
73875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarclass C2ParamTest : public ::testing::Test {
74875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
75875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
76875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarclass C2ParamTest_ParamFieldList
77875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        : public ::testing::TestWithParam<std::initializer_list<const C2FieldDescriptor>> {
78875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
79875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
80875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarenum {
81875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    kParamIndexSize,
82875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    kParamIndexTestA,
83875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    kParamIndexTestB,
84875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    kParamIndexTestFlexS32,
85875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    kParamIndexTestFlexEndS32,
86875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    kParamIndexTestFlexS64,
87875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    kParamIndexTestFlexEndS64,
88875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    kParamIndexTestFlexSize,
89875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    kParamIndexTestFlexEndSize,
90875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
91875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
92875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2SizeStruct {
93875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t mNumber;
94875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t mHeight;
95875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    enum : uint32_t { baseIndex = kParamIndexSize };                        // <= needed for C2FieldDescriptor
96875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    const static std::initializer_list<const C2FieldDescriptor> fieldList;  // <= needed for C2FieldDescriptor
97875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    const static FD::Type TYPE = (FD::Type)(baseIndex | FD::STRUCT_FLAG);
98875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
99875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
100875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarDEFINE_NO_NAMED_VALUES_FOR(C2SizeStruct)
101875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
102875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar// Test 1. define a structure without any helper methods
103875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
104875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarbool operator==(const C2FieldDescriptor &a, const C2FieldDescriptor &b) {
105875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    return a.type() == b.type()
106875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            && a.length() == b.length()
107875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            && strcmp(a.name(), b.name()) == 0
108875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            && a._mFieldId == b._mFieldId;
109875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
110875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
111875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2TestStruct_A {
112875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t mSigned32;
113875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int64_t mSigned64[2];
114875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    uint32_t mUnsigned32[1];
115875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    uint64_t mUnsigned64;
116875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    float mFloat;
117875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2SizeStruct mSize[3];
118875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    uint8_t mBlob[100];
119875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    char mString[100];
120875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    bool mYesNo[100];
121875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
122875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    const static std::initializer_list<const C2FieldDescriptor> fieldList;
123875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // enum : uint32_t { baseIndex = kParamIndexTest };
124875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // typedef C2TestStruct_A _type;
125875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar} __attribute__((packed));
126875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
127875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarconst std::initializer_list<const C2FieldDescriptor> C2TestStruct_A::fieldList =
128875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    { { FD::INT32,    1, "s32",   0, 4 },
129875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      { FD::INT64,    2, "s64",   4, 8 },
130875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      { FD::UINT32,   1, "u32",  20, 4 },
131875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      { FD::UINT64,   1, "u64",  24, 8 },
132875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      { FD::FLOAT,    1, "fp",   32, 4 },
133875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      { C2SizeStruct::TYPE, 3, "size", 36, 8 },
134875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      { FD::BLOB,   100, "blob", 60, 1 },
135875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      { FD::STRING, 100, "str", 160, 1 },
136875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      { FD::BLOB,   100, "y-n", 260, 1 } };
137875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
138875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarTEST_P(C2ParamTest_ParamFieldList, VerifyStruct) {
139875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::vector<const C2FieldDescriptor> fields = GetParam(), expected = C2TestStruct_A::fieldList;
140875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
141875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // verify first field descriptor
142875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(FD::INT32, fields[0].type());
143875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_STREQ("s32", fields[0].name());
144875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(1u, fields[0].length());
145875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(0, 4), fields[0]._mFieldId);
146875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
147875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(expected[0], fields[0]);
148875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(expected[1], fields[1]);
149875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(expected[2], fields[2]);
150875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(expected[3], fields[3]);
151875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(expected[4], fields[4]);
152875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(expected[5], fields[5]);
153875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(expected[6], fields[6]);
154875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(expected[7], fields[7]);
155875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    for (size_t i = 8; i < fields.size() && i < expected.size(); ++i) {
156875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(expected[i], fields[i]);
157875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
158875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
159875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
160875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarINSTANTIATE_TEST_CASE_P(InitializerList, C2ParamTest_ParamFieldList, ::testing::Values(C2TestStruct_A::fieldList));
161875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
162875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar// define fields using C2FieldDescriptor pointer constructor
163875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarconst std::initializer_list<const C2FieldDescriptor> C2TestStruct_A_FD_PTR_fieldList =
164875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    { C2FieldDescriptor(&((C2TestStruct_A*)(nullptr))->mSigned32,   "s32"),
165875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      C2FieldDescriptor(&((C2TestStruct_A*)(nullptr))->mSigned64,   "s64"),
166875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      C2FieldDescriptor(&((C2TestStruct_A*)(nullptr))->mUnsigned32, "u32"),
167875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      C2FieldDescriptor(&((C2TestStruct_A*)(nullptr))->mUnsigned64, "u64"),
168875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      C2FieldDescriptor(&((C2TestStruct_A*)(nullptr))->mFloat,      "fp"),
169875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      C2FieldDescriptor(&((C2TestStruct_A*)(nullptr))->mSize,       "size"),
170875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      C2FieldDescriptor(&((C2TestStruct_A*)(nullptr))->mBlob,       "blob"),
171875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      C2FieldDescriptor(&((C2TestStruct_A*)(nullptr))->mString,     "str"),
172875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    //  C2FieldDescriptor(&((C2TestStruct_A*)(nullptr))->mYesNo,      "y-n")
173875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    };
174875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
175875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarINSTANTIATE_TEST_CASE_P(PointerConstructor, C2ParamTest_ParamFieldList, ::testing::Values(C2TestStruct_A_FD_PTR_fieldList));
176875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
177875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar// define fields using C2FieldDescriptor member-pointer constructor
178875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarconst std::initializer_list<const C2FieldDescriptor> C2TestStruct_A_FD_MEM_PTR_fieldList =
179875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    { C2FieldDescriptor((C2TestStruct_A*)0, &C2TestStruct_A::mSigned32,   "s32"),
180875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      C2FieldDescriptor((C2TestStruct_A*)0, &C2TestStruct_A::mSigned64,   "s64"),
181875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      C2FieldDescriptor((C2TestStruct_A*)0, &C2TestStruct_A::mUnsigned32, "u32"),
182875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      C2FieldDescriptor((C2TestStruct_A*)0, &C2TestStruct_A::mUnsigned64, "u64"),
183875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      C2FieldDescriptor((C2TestStruct_A*)0, &C2TestStruct_A::mFloat,      "fp"),
184875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      C2FieldDescriptor((C2TestStruct_A*)0, &C2TestStruct_A::mSize,       "size"),
185875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      C2FieldDescriptor((C2TestStruct_A*)0, &C2TestStruct_A::mBlob,       "blob"),
186875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      C2FieldDescriptor((C2TestStruct_A*)0, &C2TestStruct_A::mString,     "str"),
187875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    //  C2FieldDescriptor((C2TestStruct_A*)0, &C2TestStruct_A::mYesNo,      "y-n")
188875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    };
189875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
190875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarINSTANTIATE_TEST_CASE_P(MemberPointerConstructor, C2ParamTest_ParamFieldList, ::testing::Values(C2TestStruct_A_FD_MEM_PTR_fieldList));
191875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
192875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar// Test 2. define a structure with two-step helper methods
193875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
194875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2TestAStruct {
195875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t mSigned32;
196875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int64_t mSigned64[2];
197875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    uint32_t mUnsigned32[1];
198875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    uint64_t mUnsigned64;
199875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    float mFloat;
200875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2SizeStruct mSize[3];
201875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    uint8_t mBlob[100];
202875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    char mString[100];
203875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    bool mYesNo[100];
204875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
205875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarprivate: // test access level
206875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    DEFINE_C2STRUCT(TestA)
207875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar} C2_PACK;
208875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
209875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarDESCRIBE_C2STRUCT(TestA, {
210875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mSigned32, "s32")
211875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mSigned64, "s64")
212875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mUnsigned32, "u32")
213875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mUnsigned64, "u64")
214875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mFloat, "fp")
215875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mSize, "size")
216875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mBlob, "blob")
217875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mString, "str")
218875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // C2FIELD(mYesNo, "y-n")
219875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}) // ; optional
220875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
221875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarINSTANTIATE_TEST_CASE_P(DescribeStruct2Step, C2ParamTest_ParamFieldList, ::testing::Values(C2TestAStruct::fieldList));
222875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
223875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar// Test 3. define a structure with one-step helper method
224875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
225875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2TestBStruct {
226875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t mSigned32;
227875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int64_t mSigned64[2];
228875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    uint32_t mUnsigned32[1];
229875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    uint64_t mUnsigned64;
230875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    float mFloat;
231875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2SizeStruct mSize[3];
232875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    uint8_t mBlob[100];
233875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    char mString[100];
234875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    bool mYesNo[100];
235875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
236875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarprivate: // test access level
237875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    DEFINE_AND_DESCRIBE_C2STRUCT(TestB)
238875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
239875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mSigned32, "s32")
240875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mSigned64, "s64")
241875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mUnsigned32, "u32")
242875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mUnsigned64, "u64")
243875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mFloat, "fp")
244875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mSize, "size")
245875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mBlob, "blob")
246875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mString, "str")
247875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // C2FIELD(mYesNo, "y-n")
248875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
249875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
250875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarINSTANTIATE_TEST_CASE_P(DescribeStruct1Step, C2ParamTest_ParamFieldList, ::testing::Values(C2TestBStruct::fieldList));
251875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
252875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar// Test 4. flexible members
253875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
254875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartemplate<typename T>
255875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarclass C2ParamTest_FlexParamFieldList : public ::testing::Test {
256875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarprotected:
257875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    using Type=FD::Type;
258875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
259875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // static std::initializer_list<std::initializer_list<const C2FieldDescriptor>>
260875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static std::vector<std::vector<const C2FieldDescriptor>>
261875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            GetLists();
262875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
263875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    constexpr static Type flexType =
264875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            std::is_same<T, int32_t>::value ? FD::INT32 :
265875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            std::is_same<T, int64_t>::value ? FD::INT64 :
266875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            std::is_same<T, uint32_t>::value ? FD::UINT32 :
267875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            std::is_same<T, uint64_t>::value ? FD::UINT64 :
268875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            std::is_same<T, float>::value ? FD::FLOAT :
269875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            std::is_same<T, uint8_t>::value ? FD::BLOB :
270875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            std::is_same<T, char>::value ? FD::STRING :
271875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            std::is_same<T, C2SizeStruct>::value ? C2SizeStruct::TYPE : (Type)0;
272875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    constexpr static size_t flexSize = sizeof(T);
273875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
274875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
275875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartypedef ::testing::Types<int32_t, int64_t, C2SizeStruct> FlexTypes;
276875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarTYPED_TEST_CASE(C2ParamTest_FlexParamFieldList, FlexTypes);
277875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
278875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarTYPED_TEST(C2ParamTest_FlexParamFieldList, VerifyStruct) {
279875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    for (auto a : this->GetLists()) {
280875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        std::vector<const C2FieldDescriptor> fields = a;
281875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        if (fields.size() > 1) {
282875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(2u, fields.size());
283875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(C2FieldDescriptor(FD::INT32, 1, "s32", 0, 4), fields[0]);
284875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(C2FieldDescriptor(this->flexType, 0, "flex", 4, this->flexSize),
285875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                      fields[1]);
286875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        } else {
287875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(1u, fields.size());
288875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(C2FieldDescriptor(this->flexType, 0, "flex", 0, this->flexSize),
289875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                      fields[0]);
290875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
291875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
292875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
293875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
294875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2TestStruct_FlexS32 {
295875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t mFlex[];
296875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
297875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    const static std::initializer_list<const C2FieldDescriptor> fieldList;
298875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // enum : uint32_t { baseIndex = kParamIndexTestFlex, flexSize = 4 };
299875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // typedef C2TestStruct_FlexS32 _type;
300875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // typedef int32_t flexType;
301875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
302875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
303875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarconst std::initializer_list<const C2FieldDescriptor> C2TestStruct_FlexS32::fieldList = {
304875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    { FD::INT32, 0, "flex", 0, 4 }
305875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
306875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
307875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2TestStruct_FlexEndS32 {
308875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t mSigned32;
309875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t mFlex[];
310875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
311875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    const static std::initializer_list<const C2FieldDescriptor> fieldList;
312875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // enum : uint32_t { baseIndex = kParamIndexTestFlexEnd, flexSize = 4 };
313875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // typedef C2TestStruct_FlexEnd _type;
314875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // typedef int32_t flexType;
315875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
316875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
317875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarconst std::initializer_list<const C2FieldDescriptor> C2TestStruct_FlexEndS32::fieldList = {
318875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    { FD::INT32, 1, "s32", 0, 4 },
319875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    { FD::INT32, 0, "flex", 4, 4 },
320875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
321875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
322875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarconst static std::initializer_list<const C2FieldDescriptor> C2TestStruct_FlexEndS32_ptr_fieldList = {
323875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FieldDescriptor(&((C2TestStruct_FlexEndS32*)0)->mSigned32, "s32"),
324875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FieldDescriptor(&((C2TestStruct_FlexEndS32*)0)->mFlex, "flex"),
325875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
326875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
327875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2TestFlexS32Struct {
328875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t mFlexSigned32[];
329875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarprivate: // test access level
330875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2TestFlexS32Struct() {}
331875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
332875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(TestFlexS32, mFlexSigned32)
333875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mFlexSigned32, "flex")
334875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
335875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
336875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2TestFlexEndS32Struct {
337875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t mSigned32;
338875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t mFlexSigned32[];
339875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarprivate: // test access level
340875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2TestFlexEndS32Struct() {}
341875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
342875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    DEFINE_FLEX_C2STRUCT(TestFlexEndS32, mFlexSigned32)
343875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar} C2_PACK;
344875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
345875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarDESCRIBE_C2STRUCT(TestFlexEndS32, {
346875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mSigned32, "s32")
347875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mFlexSigned32, "flex")
348875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}) // ; optional
349875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
350875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartemplate<>
351875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstd::vector<std::vector<const C2FieldDescriptor>>
352875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar//std::initializer_list<std::initializer_list<const C2FieldDescriptor>>
353875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarC2ParamTest_FlexParamFieldList<int32_t>::GetLists() {
354875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    return {
355875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2TestStruct_FlexS32::fieldList,
356875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2TestStruct_FlexEndS32::fieldList,
357875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2TestStruct_FlexEndS32_ptr_fieldList,
358875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2TestFlexS32Struct::fieldList,
359875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2TestFlexEndS32Struct::fieldList,
360875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    };
361875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
362875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
363875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2TestStruct_FlexS64 {
364875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int64_t mFlexSigned64[];
365875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
366875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    const static std::initializer_list<const C2FieldDescriptor> fieldList;
367875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // enum : uint32_t { baseIndex = kParamIndexTestFlexS64, flexSize = 8 };
368875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // typedef C2TestStruct_FlexS64 _type;
369875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // typedef int64_t flexType;
370875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
371875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
372875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarconst std::initializer_list<const C2FieldDescriptor> C2TestStruct_FlexS64::fieldList = {
373875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    { FD::INT64, 0, "flex", 0, 8 }
374875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
375875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
376875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2TestStruct_FlexEndS64 {
377875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t mSigned32;
378875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int64_t mSigned64Flex[];
379875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
380875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    const static std::initializer_list<const C2FieldDescriptor> fieldList;
381875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // enum : uint32_t { baseIndex = C2TestStruct_FlexEndS64, flexSize = 8 };
382875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // typedef C2TestStruct_FlexEndS64 _type;
383875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // typedef int64_t flexType;
384875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
385875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
386875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarconst std::initializer_list<const C2FieldDescriptor> C2TestStruct_FlexEndS64::fieldList = {
387875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    { FD::INT32, 1, "s32", 0, 4 },
388875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    { FD::INT64, 0, "flex", 4, 8 },
389875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
390875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
391875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2TestFlexS64Struct {
392875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int64_t mFlexSigned64[];
393875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2TestFlexS64Struct() {}
394875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
395875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(TestFlexS64, mFlexSigned64)
396875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mFlexSigned64, "flex")
397875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
398875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
399875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2TestFlexEndS64Struct {
400875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t mSigned32;
401875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int64_t mFlexSigned64[];
402875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2TestFlexEndS64Struct() {}
403875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
404875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    DEFINE_FLEX_C2STRUCT(TestFlexEndS64, mFlexSigned64)
405875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar} C2_PACK;
406875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
407875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarDESCRIBE_C2STRUCT(TestFlexEndS64, {
408875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mSigned32, "s32")
409875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mFlexSigned64, "flex")
410875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}) // ; optional
411875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
412875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartemplate<>
413875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstd::vector<std::vector<const C2FieldDescriptor>>
414875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar//std::initializer_list<std::initializer_list<const C2FieldDescriptor>>
415875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarC2ParamTest_FlexParamFieldList<int64_t>::GetLists() {
416875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    return {
417875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2TestStruct_FlexS64::fieldList,
418875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2TestStruct_FlexEndS64::fieldList,
419875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2TestFlexS64Struct::fieldList,
420875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2TestFlexEndS64Struct::fieldList,
421875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    };
422875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
423875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
424875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2TestStruct_FlexSize {
425875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2SizeStruct mFlexSize[];
426875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
427875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    const static std::initializer_list<const C2FieldDescriptor> fieldList;
428875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // enum : uint32_t { baseIndex = kParamIndexTestFlexSize, flexSize = 8 };
429875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // typedef C2TestStruct_FlexSize _type;
430875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // typedef C2SizeStruct flexType;
431875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
432875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
433875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarconst std::initializer_list<const C2FieldDescriptor> C2TestStruct_FlexSize::fieldList = {
434875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    { C2SizeStruct::TYPE, 0, "flex", 0, sizeof(C2SizeStruct) }
435875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
436875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
437875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2TestStruct_FlexEndSize {
438875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t mSigned32;
439875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2SizeStruct mSizeFlex[];
440875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
441875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    const static std::initializer_list<const C2FieldDescriptor> fieldList;
442875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // enum : uint32_t { baseIndex = C2TestStruct_FlexEndSize, flexSize = 8 };
443875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // typedef C2TestStruct_FlexEndSize _type;
444875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // typedef C2SizeStruct flexType;
445875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
446875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
447875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarconst std::initializer_list<const C2FieldDescriptor> C2TestStruct_FlexEndSize::fieldList = {
448875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    { FD::INT32, 1, "s32", 0, 4 },
449875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    { C2SizeStruct::TYPE, 0, "flex", 4, sizeof(C2SizeStruct) },
450875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
451875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
452875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2TestFlexSizeStruct {
453875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2SizeStruct mFlexSize[];
454875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2TestFlexSizeStruct() {}
455875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
456875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(TestFlexSize, mFlexSize)
457875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mFlexSize, "flex")
458875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
459875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
460875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2TestFlexEndSizeStruct {
461875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t mSigned32;
462875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2SizeStruct mFlexSize[];
463875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2TestFlexEndSizeStruct() {}
464875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
465875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    DEFINE_FLEX_C2STRUCT(TestFlexEndSize, mFlexSize)
466875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar} C2_PACK;
467875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
468875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarDESCRIBE_C2STRUCT(TestFlexEndSize, {
469875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mSigned32, "s32")
470875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mFlexSize, "flex")
471875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}) // ; optional
472875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
473875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartemplate<>
474875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstd::vector<std::vector<const C2FieldDescriptor>>
475875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar//std::initializer_list<std::initializer_list<const C2FieldDescriptor>>
476875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarC2ParamTest_FlexParamFieldList<C2SizeStruct>::GetLists() {
477875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    return {
478875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2TestStruct_FlexSize::fieldList,
479875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2TestStruct_FlexEndSize::fieldList,
480875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2TestFlexSizeStruct::fieldList,
481875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2TestFlexEndSizeStruct::fieldList,
482875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    };
483875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
484875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
485875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarTEST_F(C2ParamTest, FieldId) {
486875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // pointer constructor
487875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(0, 4), _C2FieldId(&((C2TestStruct_A*)0)->mSigned32));
488875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(4, 8), _C2FieldId(&((C2TestStruct_A*)0)->mSigned64));
489875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(20, 4), _C2FieldId(&((C2TestStruct_A*)0)->mUnsigned32));
490875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(24, 8), _C2FieldId(&((C2TestStruct_A*)0)->mUnsigned64));
491875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(32, 4), _C2FieldId(&((C2TestStruct_A*)0)->mFloat));
492875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(36, 8), _C2FieldId(&((C2TestStruct_A*)0)->mSize));
493875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(60, 1), _C2FieldId(&((C2TestStruct_A*)0)->mBlob));
494875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(160, 1), _C2FieldId(&((C2TestStruct_A*)0)->mString));
495875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(260, 1), _C2FieldId(&((C2TestStruct_A*)0)->mYesNo));
496875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
497875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(0, 4), _C2FieldId(&((C2TestFlexEndSizeStruct*)0)->mSigned32));
498875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(4, 8), _C2FieldId(&((C2TestFlexEndSizeStruct*)0)->mFlexSize));
499875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
500875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // member pointer constructor
501875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(0, 4), _C2FieldId((C2TestStruct_A*)0, &C2TestStruct_A::mSigned32));
502875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(4, 8), _C2FieldId((C2TestStruct_A*)0, &C2TestStruct_A::mSigned64));
503875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(20, 4), _C2FieldId((C2TestStruct_A*)0, &C2TestStruct_A::mUnsigned32));
504875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(24, 8), _C2FieldId((C2TestStruct_A*)0, &C2TestStruct_A::mUnsigned64));
505875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(32, 4), _C2FieldId((C2TestStruct_A*)0, &C2TestStruct_A::mFloat));
506875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(36, 8), _C2FieldId((C2TestStruct_A*)0, &C2TestStruct_A::mSize));
507875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(60, 1), _C2FieldId((C2TestStruct_A*)0, &C2TestStruct_A::mBlob));
508875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(160, 1), _C2FieldId((C2TestStruct_A*)0, &C2TestStruct_A::mString));
509875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(260, 1), _C2FieldId((C2TestStruct_A*)0, &C2TestStruct_A::mYesNo));
510875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
511875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(0, 4), _C2FieldId((C2TestFlexEndSizeStruct*)0, &C2TestFlexEndSizeStruct::mSigned32));
512875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(4, 8), _C2FieldId((C2TestFlexEndSizeStruct*)0, &C2TestFlexEndSizeStruct::mFlexSize));
513875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
514875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // member pointer sans type pointer
515875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(0, 4), _C2FieldId(&C2TestStruct_A::mSigned32));
516875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(4, 8), _C2FieldId(&C2TestStruct_A::mSigned64));
517875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(20, 4), _C2FieldId(&C2TestStruct_A::mUnsigned32));
518875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(24, 8), _C2FieldId(&C2TestStruct_A::mUnsigned64));
519875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(32, 4), _C2FieldId(&C2TestStruct_A::mFloat));
520875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(36, 8), _C2FieldId(&C2TestStruct_A::mSize));
521875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(60, 1), _C2FieldId(&C2TestStruct_A::mBlob));
522875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(160, 1), _C2FieldId(&C2TestStruct_A::mString));
523875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(260, 1), _C2FieldId(&C2TestStruct_A::mYesNo));
524875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
525875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(0, 4), _C2FieldId(&C2TestFlexEndSizeStruct::mSigned32));
526875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(4, 8), _C2FieldId(&C2TestFlexEndSizeStruct::mFlexSize));
527875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
528875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    typedef C2GlobalParam<C2Info, C2TestAStruct> C2TestAInfo;
529875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    typedef C2GlobalParam<C2Info, C2TestFlexEndSizeStruct> C2TestFlexEndSizeInfo;
530875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
531875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // pointer constructor in C2Param
532875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(8, 4), _C2FieldId(&((C2TestAInfo*)0)->mSigned32));
533875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(12, 8), _C2FieldId(&((C2TestAInfo*)0)->mSigned64));
534875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(28, 4), _C2FieldId(&((C2TestAInfo*)0)->mUnsigned32));
535875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(32, 8), _C2FieldId(&((C2TestAInfo*)0)->mUnsigned64));
536875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(40, 4), _C2FieldId(&((C2TestAInfo*)0)->mFloat));
537875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(44, 8), _C2FieldId(&((C2TestAInfo*)0)->mSize));
538875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(68, 1), _C2FieldId(&((C2TestAInfo*)0)->mBlob));
539875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(168, 1), _C2FieldId(&((C2TestAInfo*)0)->mString));
540875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(268, 1), _C2FieldId(&((C2TestAInfo*)0)->mYesNo));
541875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
542875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(8, 4), _C2FieldId(&((C2TestFlexEndSizeInfo*)0)->m.mSigned32));
543875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(12, 8), _C2FieldId(&((C2TestFlexEndSizeInfo*)0)->m.mFlexSize));
544875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
545875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // member pointer in C2Param
546875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(8, 4), _C2FieldId((C2TestAInfo*)0, &C2TestAInfo::mSigned32));
547875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(12, 8), _C2FieldId((C2TestAInfo*)0, &C2TestAInfo::mSigned64));
548875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(28, 4), _C2FieldId((C2TestAInfo*)0, &C2TestAInfo::mUnsigned32));
549875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(32, 8), _C2FieldId((C2TestAInfo*)0, &C2TestAInfo::mUnsigned64));
550875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(40, 4), _C2FieldId((C2TestAInfo*)0, &C2TestAInfo::mFloat));
551875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(44, 8), _C2FieldId((C2TestAInfo*)0, &C2TestAInfo::mSize));
552875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(68, 1), _C2FieldId((C2TestAInfo*)0, &C2TestAInfo::mBlob));
553875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(168, 1), _C2FieldId((C2TestAInfo*)0, &C2TestAInfo::mString));
554875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(_C2FieldId(268, 1), _C2FieldId((C2TestAInfo*)0, &C2TestAInfo::mYesNo));
555875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
556875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // NOTE: cannot use a member pointer for flex params due to introduction of 'm'
557875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // EXPECT_EQ(_C2FieldId(8, 4), _C2FieldId(&C2TestFlexEndSizeInfo::m.mSigned32));
558875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // EXPECT_EQ(_C2FieldId(12, 8), _C2FieldId(&C2TestFlexEndSizeInfo::m.mFlexSize));
559875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
560875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
561875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
562875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
563875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
564875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct S32 {
565875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    template<typename T, class B=typename std::remove_extent<T>::type>
566875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    inline S32(const T*) {
567875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(!std::is_array<T>::value, "should not be an array");
568875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(std::is_same<B, int32_t>::value, "should be int32_t");
569875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
570875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
571875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
572875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct FLX {
573875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    template<typename U, typename T, class B=typename std::remove_extent<T>::type>
574875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    inline FLX(const T*, const U*) {
575875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(std::is_array<T>::value, "should be an array");
576875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(std::extent<T>::value == 0, "should be an array of 0 extent");
577875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(std::is_same<B, U>::value, "should be type U");
578875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
579875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
580875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
581875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct MP {
582875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    template<typename U, typename T, typename ExpectedU, typename UnexpectedU>
583875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    inline MP(T U::*, const ExpectedU*, const UnexpectedU*) {
584875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(!std::is_same<U, UnexpectedU>::value, "should not be member pointer of the base type");
585875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(std::is_same<U, ExpectedU>::value, "should be member pointer of the derived type");
586875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
587875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
588875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    template<typename U, typename T, typename B, typename D>
589875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    inline MP(T D::*, const D*) { }
590875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
591875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
592875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarvoid compiledStatic_arrayTypePropagationTest() {
593875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    (void)S32(&((C2TestFlexEndS32Struct *)0)->mSigned32);
594875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    (void)FLX(&((C2TestFlexEndS32Struct *)0)->mFlexSigned32, (int32_t*)0);
595875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    (void)FLX(&((C2TestFlexS32Struct *)0)->mFlexSigned32, (int32_t*)0);
596875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
597875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    typedef C2GlobalParam<C2Info, C2TestAStruct> C2TestAInfo;
598875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
599875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // TRICKY: &derivedClass::baseMember has type of baseClass::*
600875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(std::is_same<decltype(&C2TestAInfo::mSigned32), int32_t C2TestAStruct::*>::value,
601875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                  "base member pointer should have base class in type");
602875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
603875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // therefore, member pointer expands to baseClass::* in templates
604875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    (void)MP(&C2TestAInfo::mSigned32,
605875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar             (C2TestAStruct*)0 /* expected */, (C2TestAInfo*)0 /* unexpected */);
606875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // but can be cast to derivedClass::*
607875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    (void)MP((int32_t C2TestAInfo::*)&C2TestAInfo::mSigned32,
608875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar             (C2TestAInfo*)0 /* expected */, (C2TestAStruct*)0 /* unexpected */);
609875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
610875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // TRICKY: baseClass::* does not autoconvert to derivedClass::* even in templates
611875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // (void)MP(&C2TestAInfo::mSigned32, (C2TestAInfo*)0);
612875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
613875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
614875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarTEST_F(C2ParamTest, MemberPointerCast) {
615875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    typedef C2GlobalParam<C2Info, C2TestAStruct> C2TestAInfo;
616875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
617875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2TestAInfo, mSigned32) == 8, "offset should be 8");
618875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    constexpr int32_t C2TestAStruct::* s32ptr = &C2TestAInfo::mSigned32;
619875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    constexpr int32_t C2TestAInfo::* s32ptr_derived = (int32_t C2TestAStruct::*)&C2TestAInfo::mSigned32;
620875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    constexpr int32_t C2TestAInfo::* s32ptr_cast2derived = (int32_t C2TestAInfo::*)s32ptr;
621875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2TestAInfo *info = (C2TestAInfo *)256;
622875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2TestAStruct *strukt = (C2TestAStruct *)info;
623875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t *info_s32_derived = &(info->*s32ptr_derived);
624875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t *info_s32_cast2derived = &(info->*s32ptr_cast2derived);
625875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t *info_s32 = &(info->*s32ptr);
626875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t *strukt_s32 = &(strukt->*s32ptr);
627875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
628875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(256u, (uintptr_t)info);
629875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(264u, (uintptr_t)strukt);
630875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(264u, (uintptr_t)info_s32_derived);
631875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(264u, (uintptr_t)info_s32_cast2derived);
632875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(264u, (uintptr_t)info_s32);
633875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(264u, (uintptr_t)strukt_s32);
634875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
635875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    typedef C2GlobalParam<C2Info, C2TestFlexEndSizeStruct> C2TestFlexEndSizeInfo;
636875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2TestFlexEndSizeInfo, m.mSigned32) == 8, "offset should be 8");
637875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2TestFlexEndSizeInfo, m.mFlexSize) == 12, "offset should be 12");
638875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
639875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
640875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar/* ===================================== PARAM USAGE TESTS ===================================== */
641875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
642875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2NumberStruct {
643875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t mNumber;
644875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2NumberStruct() {}
645875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2NumberStruct(int32_t _number) : mNumber(_number) {}
646875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
647875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    DEFINE_AND_DESCRIBE_C2STRUCT(Number)
648875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mNumber, "number")
649875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
650875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
651875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2NumbersStruct {
652875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t mNumbers[];
653875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2NumbersStruct() {}
654875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
655875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(Numbers, mNumbers)
656875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mNumbers, "numbers")
657875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
658875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstatic_assert(sizeof(C2NumbersStruct) == 0, "C2NumbersStruct has incorrect size");
659875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
660875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartypedef C2GlobalParam<C2Tuning, C2NumberStruct> C2NumberTuning;
661875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartypedef   C2PortParam<C2Tuning, C2NumberStruct> C2NumberPortTuning;
662875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartypedef C2StreamParam<C2Tuning, C2NumberStruct> C2NumberStreamTuning;
663875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
664875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartypedef C2GlobalParam<C2Tuning, C2NumbersStruct> C2NumbersTuning;
665875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartypedef   C2PortParam<C2Tuning, C2NumbersStruct> C2NumbersPortTuning;
666875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartypedef C2StreamParam<C2Tuning, C2NumbersStruct> C2NumbersStreamTuning;
667875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
668875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar//
669875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar#if 0
670875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
671875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarvoid test() {
672875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2NumberStruct s(10);
673875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    (void)C2NumberStruct::fieldList;
674875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
675875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
676875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartypedef C2StreamParam<C2Tuning, C2Int64Value, kParamIndexNumberB> C2NumberConfig4;
677875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartypedef C2PortParam<C2Tuning, C2Int32Value, kParamIndexNumber> C2NumberConfig3;
678875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartypedef C2GlobalParam<C2Tuning, C2StringValue, kParamIndexNumber> C2VideoNameConfig;
679875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
680875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarvoid test3() {
681875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2NumberConfig3 s(10);
682875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    s.mValue = 11;
683875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    s = 12;
684875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    (void)C2NumberConfig3::fieldList;
685875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::shared_ptr<C2VideoNameConfig> n = C2VideoNameConfig::alloc_shared(25);
686875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    strcpy(n->m.mValue, "lajos");
687875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2NumberConfig4 t(false, 0, 11);
688875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    t.mValue = 15;
689875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
690875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
691875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2NumbersStruct {
692875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t mNumbers[];
693875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    enum { baseIndex = kParamIndexNumber };
694875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    const static std::initializer_list<const C2FieldDescriptor> fieldList;
695875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2NumbersStruct() {}
696875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
697875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    FLEX(C2NumbersStruct, mNumbers);
698875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
699875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
700875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstatic_assert(sizeof(C2NumbersStruct) == 0, "yes");
701875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
702875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
703875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartypedef C2GlobalParam<C2Info, C2NumbersStruct> C2NumbersInfo;
704875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
705875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarconst std::initializer_list<const C2FieldDescriptor> C2NumbersStruct::fieldList =
706875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar//    { { FD::INT32, 0, "widths" } };
707875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    { C2FieldDescriptor(&((C2NumbersStruct*)(nullptr))->mNumbers, "number") };
708875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
709875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartypedef C2PortParam<C2Tuning, C2NumberStruct> C2NumberConfig;
710875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
711875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstd::list<const C2FieldDescriptor> myList = C2NumberConfig::fieldList;
712875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
713875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::unique_ptr<android::C2ParamDescriptor> __test_describe(uint32_t paramType) {
714875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        std::list<const C2FieldDescriptor> fields = describeC2Params<C2NumberConfig>();
715875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
716875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        auto widths = C2NumbersInfo::alloc_shared(5);
717875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        widths->flexCount();
718875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        widths->m.mNumbers[4] = 1;
719875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
720875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        test();
721875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        test3();
722875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
723875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2NumberConfig outputWidth(false, 123);
724875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
725875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2Param::Index index(paramType);
726875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        switch (paramType) {
727875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        case C2NumberConfig::baseIndex:
728875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            return std::unique_ptr<C2ParamDescriptor>(new C2ParamDescriptor{
729875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                true /* isRequired */,
730875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                "number",
731875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                index,
732875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            });
733875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
734875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        return nullptr;
735875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
736875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
737875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
738875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar} // namespace android
739875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
740875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar#endif
741875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar//
742875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
743875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartemplate<typename T>
744875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarbool canSetPort(T &o, bool output) { return o.setPort(output); }
745875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarbool canSetPort(...) { return false; }
746875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
747875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartemplate<typename S, typename=decltype(((S*)0)->setPort(true))>
748875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstatic std::true_type _canCallSetPort(int);
749875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartemplate<typename>
750875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstatic std::false_type _canCallSetPort(...);
751875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar#define canCallSetPort(x) decltype(_canCallSetPort<std::remove_reference<decltype(x)>::type>(0))::value
752875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
753875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar/* ======================================= STATIC TESTS ======================================= */
754875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
755875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstatic_assert(_C2Comparable<int>::value, "int is not comparable");
756875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstatic_assert(!_C2Comparable<void>::value, "void is comparable");
757875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
758875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2_HIDE _test0 {
759875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    bool operator==(const _test0&);
760875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    bool operator!=(const _test0&);
761875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
762875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2_HIDE _test1 {
763875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    bool operator==(const _test1&);
764875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
765875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2_HIDE _test2 {
766875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    bool operator!=(const _test2&);
767875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
768875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstatic_assert(_C2Comparable<_test0>::value, "class with == and != is not comparable");
769875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstatic_assert(_C2Comparable<_test1>::value, "class with == is not comparable");
770875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstatic_assert(_C2Comparable<_test2>::value, "class with != is not comparable");
771875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
772875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar/* ======================================= C2PARAM TESTS ======================================= */
773875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
774875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct _C2ParamInspector {
775875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static void StaticTest();
776875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static void StaticFlexTest();
777875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
778875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
779875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar// TEST_F(_C2ParamInspector, StaticTest) {
780875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarvoid _C2ParamInspector::StaticTest() {
781875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    typedef C2Param::Index I;
782875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
783875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // C2NumberStruct: baseIndex = kIndex                          (args)
784875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2NumberStruct::baseIndex == kParamIndexNumber, "bad index");
785875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(sizeof(C2NumberStruct) == 4, "bad size");
786875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
787875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // C2NumberTuning:             kIndex | tun | global           (args)
788875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2NumberTuning::baseIndex == kParamIndexNumber, "bad index");
789875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2NumberTuning::typeIndex == (kParamIndexNumber | I::kTypeTuning | I::kDirGlobal), "bad index");
790875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(sizeof(C2NumberTuning) == 12, "bad size");
791875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
792875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumberTuning, _mSize) == 0, "bad size");
793875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumberTuning, _mIndex) == 4, "bad offset");
794875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumberTuning, mNumber) == 8, "bad offset");
795875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
796875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // C2NumberPortTuning:         kIndex | tun | port             (bool, args)
797875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(sizeof(C2NumberPortTuning) == 12, "bad size");
798875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // C2NumberPortTuning::input:  kIndex | tun | port | input     (args)
799875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // C2NumberPortTuning::output: kIndex | tun | port | output    (args)
800875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2NumberPortTuning::input::baseIndex ==
801875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                  kParamIndexNumber, "bad index");
802875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2NumberPortTuning::input::typeIndex ==
803875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                  (kParamIndexNumber | I::kTypeTuning | I::kDirInput), "bad index");
804875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2NumberPortTuning::output::baseIndex ==
805875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                  kParamIndexNumber, "bad index");
806875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2NumberPortTuning::output::typeIndex ==
807875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                  (kParamIndexNumber | I::kTypeTuning | I::kDirOutput), "bad index");
808875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(sizeof(C2NumberPortTuning::input) == 12, "bad size");
809875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(sizeof(C2NumberPortTuning::output) == 12, "bad size");
810875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumberPortTuning::input, _mSize) == 0, "bad size");
811875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumberPortTuning::input, _mIndex) == 4, "bad offset");
812875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumberPortTuning::input, mNumber) == 8, "bad offset");
813875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumberPortTuning::output, _mSize) == 0, "bad size");
814875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumberPortTuning::output, _mIndex) == 4, "bad offset");
815875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumberPortTuning::output, mNumber) == 8, "bad offset");
816875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
817875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // C2NumberStreamTuning:       kIndex | tun | str              (bool, uint, args)
818875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(sizeof(C2NumberStreamTuning) == 12u, "bad size");
819875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // C2NumberStreamTuning::input kIndex | tun | str | input      (int, args)
820875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // C2NumberStreamTuning::output kIx   | tun | str | output     (int, args)
821875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2NumberStreamTuning::input::baseIndex ==
822875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                  kParamIndexNumber, "bad index");
823875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2NumberStreamTuning::input::typeIndex ==
824875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                  (kParamIndexNumber | I::kTypeTuning | I::kDirInput | I::kStreamFlag), "bad index");
825875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2NumberStreamTuning::output::baseIndex ==
826875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                  kParamIndexNumber, "bad index");
827875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2NumberStreamTuning::output::typeIndex ==
828875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                  (kParamIndexNumber | I::kTypeTuning | I::kDirOutput | I::kStreamFlag), "bad index");
829875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(sizeof(C2NumberStreamTuning::input) == 12u, "bad size");
830875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(sizeof(C2NumberStreamTuning::output) == 12u, "bad size");
831875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumberStreamTuning::input, _mSize) == 0, "bad size");
832875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumberStreamTuning::input, _mIndex) == 4, "bad offset");
833875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumberStreamTuning::input, mNumber) == 8, "bad offset");
834875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumberStreamTuning::output, _mSize) == 0, "bad size");
835875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumberStreamTuning::output, _mIndex) == 4, "bad offset");
836875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumberStreamTuning::output, mNumber) == 8, "bad offset");
837875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
838875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
839875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarvoid _C2ParamInspector::StaticFlexTest() {
840875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    typedef C2Param::Index I;
841875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
842875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // C2NumbersStruct: baseIndex = kIndex                          (args)
843875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2NumbersStruct::baseIndex == (I::kFlexibleFlag | kParamIndexNumbers), "bad index");
844875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(sizeof(C2NumbersStruct) == 0, "bad size");
845875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
846875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // C2NumbersTuning:             kIndex | tun | global           (args)
847875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2NumbersTuning::baseIndex == (I::kFlexibleFlag | kParamIndexNumbers), "bad index");
848875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2NumbersTuning::typeIndex == (I::kFlexibleFlag | kParamIndexNumbers | I::kTypeTuning | I::kDirGlobal), "bad index");
849875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(sizeof(C2NumbersTuning) == 8, "bad size");
850875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
851875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumbersTuning, _mSize) == 0, "bad size");
852875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumbersTuning, _mIndex) == 4, "bad offset");
853875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumbersTuning, m.mNumbers) == 8, "bad offset");
854875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
855875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // C2NumbersPortTuning:         kIndex | tun | port             (bool, args)
856875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(sizeof(C2NumbersPortTuning) == 8, "bad size");
857875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // C2NumbersPortTuning::input:  kIndex | tun | port | input     (args)
858875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // C2NumbersPortTuning::output: kIndex | tun | port | output    (args)
859875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2NumbersPortTuning::input::baseIndex ==
860875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                  (I::kFlexibleFlag | kParamIndexNumbers), "bad index");
861875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2NumbersPortTuning::input::typeIndex ==
862875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                  (I::kFlexibleFlag | kParamIndexNumbers | I::kTypeTuning | I::kDirInput), "bad index");
863875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2NumbersPortTuning::output::baseIndex ==
864875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                  (I::kFlexibleFlag | kParamIndexNumbers), "bad index");
865875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2NumbersPortTuning::output::typeIndex ==
866875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                  (I::kFlexibleFlag | kParamIndexNumbers | I::kTypeTuning | I::kDirOutput), "bad index");
867875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(sizeof(C2NumbersPortTuning::input) == 8, "bad size");
868875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(sizeof(C2NumbersPortTuning::output) == 8, "bad size");
869875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumbersPortTuning::input, _mSize) == 0, "bad size");
870875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumbersPortTuning::input, _mIndex) == 4, "bad offset");
871875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumbersPortTuning::input, m.mNumbers) == 8, "bad offset");
872875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumbersPortTuning::output, _mSize) == 0, "bad size");
873875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumbersPortTuning::output, _mIndex) == 4, "bad offset");
874875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumbersPortTuning::output, m.mNumbers) == 8, "bad offset");
875875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
876875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // C2NumbersStreamTuning:       kIndex | tun | str              (bool, uint, args)
877875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(sizeof(C2NumbersStreamTuning) == 8, "bad size");
878875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // C2NumbersStreamTuning::input kIndex | tun | str | input      (int, args)
879875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // C2NumbersStreamTuning::output kIx   | tun | str | output     (int, args)
880875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2NumbersStreamTuning::input::baseIndex ==
881875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                  (I::kFlexibleFlag | kParamIndexNumbers), "bad index");
882875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2NumbersStreamTuning::input::typeIndex ==
883875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                  (I::kFlexibleFlag | kParamIndexNumbers | I::kTypeTuning | I::kDirInput | I::kStreamFlag), "bad index");
884875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2NumbersStreamTuning::output::baseIndex ==
885875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                  (I::kFlexibleFlag | kParamIndexNumbers), "bad index");
886875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2NumbersStreamTuning::output::typeIndex ==
887875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                  (I::kFlexibleFlag | kParamIndexNumbers | I::kTypeTuning | I::kDirOutput | I::kStreamFlag), "bad index");
888875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(sizeof(C2NumbersStreamTuning::input) == 8, "bad size");
889875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(sizeof(C2NumbersStreamTuning::output) == 8, "bad size");
890875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumbersStreamTuning::input, _mSize) == 0, "bad size");
891875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumbersStreamTuning::input, _mIndex) == 4, "bad offset");
892875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumbersStreamTuning::input, m.mNumbers) == 8, "bad offset");
893875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumbersStreamTuning::output, _mSize) == 0, "bad size");
894875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumbersStreamTuning::output, _mIndex) == 4, "bad offset");
895875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(offsetof(C2NumbersStreamTuning::output, m.mNumbers) == 8, "bad offset");
896875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
897875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
898875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarTEST_F(C2ParamTest, ParamOpsTest) {
899875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    const C2NumberStruct str(100);
900875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2NumberStruct bstr;
901875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
902875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    {
903875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(100, str.mNumber);
904875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bstr.mNumber = 100;
905875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
906875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2Param::BaseIndex index = C2NumberStruct::baseIndex;
907875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(index.isVendor());
908875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(index.isFlexible());
909875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.baseIndex(), kParamIndexNumber);
910875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.paramIndex(), kParamIndexNumber);
911875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
912875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
913875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    const C2NumberTuning tun(100);
914875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2NumberTuning btun;
915875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
916875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    {
917875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        // flags & invariables
918875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto &p : { tun, btun }) {
919875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE((bool)p);
920875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(!p);
921875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(12u, p.size());
922875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
923875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.isVendor());
924875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.isFlexible());
925875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p.isGlobal());
926875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.forInput());
927875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.forOutput());
928875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.forStream());
929875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.forPort());
930875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
931875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
932875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        // value
933875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(100, tun.mNumber);
934875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, btun.mNumber);
935875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(tun == btun);
936875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(tun.operator==(btun));
937875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(tun != btun);
938875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(tun.operator!=(btun));
939875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        btun.mNumber = 100;
940875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(tun, btun);
941875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
942875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        // index
943875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(tun.type()).baseIndex(), C2NumberStruct::baseIndex);
944875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(tun.type()).paramIndex(), kParamIndexNumber);
945875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(tun.type(), C2NumberTuning::typeIndex);
946875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(tun.stream(), ~0u);
947875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
948875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2Param::BaseIndex index = C2NumberTuning::baseIndex;
949875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(index.isVendor());
950875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(index.isFlexible());
951875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.baseIndex(), kParamIndexNumber);
952875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.paramIndex(), kParamIndexNumber);
953875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
954875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2Param::Type type = C2NumberTuning::typeIndex;
955875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isVendor());
956875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isFlexible());
957875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.isGlobal());
958875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forInput());
959875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forOutput());
960875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forStream());
961875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forPort());
962875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
963875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberTuning::From(nullptr), nullptr);
964875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberTuning::From(&tun), &tun);
965875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::From(&tun), nullptr);
966875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::input::From(&tun), nullptr);
967875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::output::From(&tun), nullptr);
968875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::From(&tun), nullptr);
969875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::input::From(&tun), nullptr);
970875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::output::From(&tun), nullptr);
971875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
972875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
973875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    const C2NumberPortTuning outp1(true, 100), inp1(false, 100);
974875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2NumberPortTuning boutp1, binp1, binp3(false, 100);
975875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    const C2NumberPortTuning::input inp2(100);
976875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2NumberPortTuning::input binp2;
977875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    const C2NumberPortTuning::output outp2(100);
978875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2NumberPortTuning::output boutp2;
979875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
980875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    {
981875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(canCallSetPort(binp3), "should be able to");
982875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(canCallSetPort(binp1), "should be able to");
983875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(!canCallSetPort(inp1), "should not be able to (const)");
984875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(!canCallSetPort(inp2), "should not be able to (const & type)");
985875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(!canCallSetPort(binp2), "should not be able to (type)");
986875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
987875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        // flags & invariables
988875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto &p : { outp1, inp1, boutp1 }) {
989875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(12u, p.size());
990875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.isVendor());
991875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.isFlexible());
992875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.isGlobal());
993875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.forStream());
994875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p.forPort());
995875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
996875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto &p : { inp2, binp2 }) {
997875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(12u, p.size());
998875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.isVendor());
999875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.isFlexible());
1000875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.isGlobal());
1001875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.forStream());
1002875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p.forPort());
1003875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1004875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto &p : { outp2, boutp2 }) {
1005875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(12u, p.size());
1006875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.isVendor());
1007875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.isFlexible());
1008875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.isGlobal());
1009875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.forStream());
1010875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p.forPort());
1011875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1012875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1013875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        // port specific flags & invariables
1014875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(outp1.forInput());
1015875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(outp1.forOutput());
1016875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1017875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(inp1.forInput());
1018875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(inp1.forOutput());
1019875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1020875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto &p : { outp1, inp1 }) {
1021875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE((bool)p);
1022875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(!p);
1023875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(100, p.mNumber);
1024875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1025875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto &p : { outp2, boutp2 }) {
1026875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE((bool)p);
1027875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(!p);
1028875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1029875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.forInput());
1030875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p.forOutput());
1031875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1032875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto &p : { inp2, binp2 }) {
1033875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE((bool)p);
1034875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(!p);
1035875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1036875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p.forInput());
1037875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.forOutput());
1038875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1039875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto &p : { boutp1 } ) {
1040875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE((bool)p);
1041875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(!p);
1042875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1043875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.forInput());
1044875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.forOutput());
1045875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(0, p.mNumber);
1046875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1047875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1048875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        // values
1049875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(100, inp2.mNumber);
1050875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(100, outp2.mNumber);
1051875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, binp1.mNumber);
1052875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, binp2.mNumber);
1053875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, boutp1.mNumber);
1054875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, boutp2.mNumber);
1055875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1056875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(inp1 != outp1);
1057875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(inp1 == inp2);
1058875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(outp1 == outp2);
1059875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(binp1 == boutp1);
1060875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(binp2 != boutp2);
1061875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1062875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(inp1 != binp1);
1063875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        binp1.mNumber = 100;
1064875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(inp1 != binp1);
1065875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        binp1.setPort(false /* output */);
1066875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE((bool)binp1);
1067875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(!binp1);
1068875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(inp1 == binp1);
1069875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1070875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(inp2 != binp2);
1071875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        binp2.mNumber = 100;
1072875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(inp2 == binp2);
1073875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1074875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        binp1.setPort(true /* output */);
1075875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(outp1 == binp1);
1076875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1077875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(outp1 != boutp1);
1078875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        boutp1.mNumber = 100;
1079875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(outp1 != boutp1);
1080875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        boutp1.setPort(true /* output */);
1081875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE((bool)boutp1);
1082875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(!boutp1);
1083875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(outp1 == boutp1);
1084875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1085875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(outp2 != boutp2);
1086875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        boutp2.mNumber = 100;
1087875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(outp2 == boutp2);
1088875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1089875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        boutp1.setPort(false /* output */);
1090875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(inp1 == boutp1);
1091875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1092875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        // index
1093875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(inp1.type()).baseIndex(), C2NumberStruct::baseIndex);
1094875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(inp1.type()).paramIndex(), kParamIndexNumber);
1095875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(inp1.type(), C2NumberPortTuning::input::typeIndex);
1096875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(inp1.stream(), ~0u);
1097875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1098875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(inp2.type()).baseIndex(), C2NumberStruct::baseIndex);
1099875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(inp2.type()).paramIndex(), kParamIndexNumber);
1100875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(inp2.type(), C2NumberPortTuning::input::typeIndex);
1101875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(inp2.stream(), ~0u);
1102875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1103875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(outp1.type()).baseIndex(), C2NumberStruct::baseIndex);
1104875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(outp1.type()).paramIndex(), kParamIndexNumber);
1105875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(outp1.type(), C2NumberPortTuning::output::typeIndex);
1106875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(outp1.stream(), ~0u);
1107875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1108875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(outp2.type()).baseIndex(), C2NumberStruct::baseIndex);
1109875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(outp2.type()).paramIndex(), kParamIndexNumber);
1110875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(outp2.type(), C2NumberPortTuning::output::typeIndex);
1111875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(outp2.stream(), ~0u);
1112875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1113875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2Param::BaseIndex index = C2NumberPortTuning::input::typeIndex;
1114875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(index.isVendor());
1115875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(index.isFlexible());
1116875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.baseIndex(), kParamIndexNumber);
1117875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.paramIndex(), kParamIndexNumber);
1118875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1119875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        index = C2NumberPortTuning::output::typeIndex;
1120875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(index.isVendor());
1121875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(index.isFlexible());
1122875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.baseIndex(), kParamIndexNumber);
1123875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.paramIndex(), kParamIndexNumber);
1124875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1125875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2Param::Type type = C2NumberPortTuning::input::typeIndex;
1126875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isVendor());
1127875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isFlexible());
1128875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isGlobal());
1129875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.forInput());
1130875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forOutput());
1131875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forStream());
1132875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.forPort());
1133875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1134875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        type = C2NumberPortTuning::output::typeIndex;
1135875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isVendor());
1136875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isFlexible());
1137875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isGlobal());
1138875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forInput());
1139875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.forOutput());
1140875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forStream());
1141875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.forPort());
1142875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1143875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::From(nullptr), nullptr);
1144875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::input::From(nullptr), nullptr);
1145875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::output::From(nullptr), nullptr);
1146875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberTuning::From(&inp1), nullptr);
1147875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberTuning::From(&inp2), nullptr);
1148875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberTuning::From(&outp1), nullptr);
1149875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberTuning::From(&outp2), nullptr);
1150875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::From(&inp1), &inp1);
1151875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::From(&inp2), (C2NumberPortTuning*)&inp2);
1152875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::From(&outp1), &outp1);
1153875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::From(&outp2), (C2NumberPortTuning*)&outp2);
1154875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::input::From(&inp1), (C2NumberPortTuning::input*)&inp1);
1155875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::input::From(&inp2), &inp2);
1156875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::input::From(&outp1), nullptr);
1157875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::input::From(&outp2), nullptr);
1158875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::output::From(&inp1), nullptr);
1159875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::output::From(&inp2), nullptr);
1160875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::output::From(&outp1), (C2NumberPortTuning::output*)&outp1);
1161875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::output::From(&outp2), &outp2);
1162875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::From(&inp1), nullptr);
1163875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::From(&inp2), nullptr);
1164875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::From(&outp1), nullptr);
1165875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::From(&outp2), nullptr);
1166875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::input::From(&inp1), nullptr);
1167875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::input::From(&inp2), nullptr);
1168875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::input::From(&outp1), nullptr);
1169875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::input::From(&outp2), nullptr);
1170875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::output::From(&inp1), nullptr);
1171875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::output::From(&inp2), nullptr);
1172875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::output::From(&outp1), nullptr);
1173875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::output::From(&outp2), nullptr);
1174875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
1175875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1176875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    const C2NumberStreamTuning outs1(true, 1u, 100), ins1(false, 1u, 100);
1177875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2NumberStreamTuning bouts1, bins1, bins3(false, 1u, 100);
1178875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    const C2NumberStreamTuning::input ins2(1u, 100);
1179875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2NumberStreamTuning::input bins2;
1180875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    const C2NumberStreamTuning::output outs2(1u, 100);
1181875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2NumberStreamTuning::output bouts2;
1182875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1183875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    {
1184875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(canCallSetPort(bins3), "should be able to");
1185875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(canCallSetPort(bins1), "should be able to");
1186875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(!canCallSetPort(ins1), "should not be able to (const)");
1187875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(!canCallSetPort(ins2), "should not be able to (const & type)");
1188875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(!canCallSetPort(bins2), "should not be able to (type)");
1189875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1190875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        // flags & invariables
1191875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto &p : { outs1, ins1, bouts1 }) {
1192875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(12u, p.size());
1193875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.isVendor());
1194875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.isFlexible());
1195875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.isGlobal());
1196875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p.forStream());
1197875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.forPort());
1198875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1199875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto &p : { ins2, bins2 }) {
1200875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(12u, p.size());
1201875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.isVendor());
1202875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.isFlexible());
1203875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.isGlobal());
1204875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p.forStream());
1205875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.forPort());
1206875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1207875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto &p : { outs2, bouts2 }) {
1208875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(12u, p.size());
1209875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.isVendor());
1210875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.isFlexible());
1211875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.isGlobal());
1212875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p.forStream());
1213875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.forPort());
1214875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1215875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1216875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        // port specific flags & invariables
1217875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(outs1.forInput());
1218875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(outs1.forOutput());
1219875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1220875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(ins1.forInput());
1221875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(ins1.forOutput());
1222875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1223875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto &p : { outs1, ins1 }) {
1224875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE((bool)p);
1225875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(!p);
1226875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(100, p.mNumber);
1227875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(1u, p.stream());
1228875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1229875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto &p : { outs2, bouts2 }) {
1230875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE((bool)p);
1231875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(!p);
1232875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1233875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.forInput());
1234875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p.forOutput());
1235875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1236875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto &p : { ins2, bins2 }) {
1237875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE((bool)p);
1238875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(!p);
1239875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1240875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p.forInput());
1241875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.forOutput());
1242875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1243875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto &p : { bouts1 } ) {
1244875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE((bool)p);
1245875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(!p);
1246875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1247875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.forInput());
1248875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p.forOutput());
1249875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(0, p.mNumber);
1250875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1251875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1252875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        // values
1253875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(100, ins2.mNumber);
1254875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(100, outs2.mNumber);
1255875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, bins1.mNumber);
1256875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, bins2.mNumber);
1257875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, bouts1.mNumber);
1258875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, bouts2.mNumber);
1259875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1260875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(1u, ins2.stream());
1261875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(1u, outs2.stream());
1262875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0u, bins1.stream());
1263875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0u, bins2.stream());
1264875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0u, bouts1.stream());
1265875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0u, bouts2.stream());
1266875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1267875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(ins1 != outs1);
1268875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(ins1 == ins2);
1269875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(outs1 == outs2);
1270875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(bins1 == bouts1);
1271875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(bins2 != bouts2);
1272875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1273875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(ins1 != bins1);
1274875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bins1.mNumber = 100;
1275875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(ins1 != bins1);
1276875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bins1.setPort(false /* output */);
1277875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(ins1 != bins1);
1278875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bins1.setStream(1u);
1279875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(ins1 == bins1);
1280875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1281875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(ins2 != bins2);
1282875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bins2.mNumber = 100;
1283875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(ins2 != bins2);
1284875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bins2.setStream(1u);
1285875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(ins2 == bins2);
1286875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1287875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bins1.setPort(true /* output */);
1288875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(outs1 == bins1);
1289875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1290875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(outs1 != bouts1);
1291875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bouts1.mNumber = 100;
1292875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(outs1 != bouts1);
1293875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bouts1.setPort(true /* output */);
1294875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(outs1 != bouts1);
1295875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bouts1.setStream(1u);
1296875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(outs1 == bouts1);
1297875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1298875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(outs2 != bouts2);
1299875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bouts2.mNumber = 100;
1300875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(outs2 != bouts2);
1301875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bouts2.setStream(1u);
1302875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(outs2 == bouts2);
1303875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1304875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bouts1.setPort(false /* output */);
1305875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(ins1 == bouts1);
1306875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1307875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        // index
1308875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(ins1.type()).baseIndex(), C2NumberStruct::baseIndex);
1309875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(ins1.type()).paramIndex(), kParamIndexNumber);
1310875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(ins1.type(), C2NumberStreamTuning::input::typeIndex);
1311875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1312875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(ins2.type()).baseIndex(), C2NumberStruct::baseIndex);
1313875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(ins2.type()).paramIndex(), kParamIndexNumber);
1314875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(ins2.type(), C2NumberStreamTuning::input::typeIndex);
1315875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1316875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(outs1.type()).baseIndex(), C2NumberStruct::baseIndex);
1317875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(outs1.type()).paramIndex(), kParamIndexNumber);
1318875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(outs1.type(), C2NumberStreamTuning::output::typeIndex);
1319875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1320875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(outs2.type()).baseIndex(), C2NumberStruct::baseIndex);
1321875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(outs2.type()).paramIndex(), kParamIndexNumber);
1322875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(outs2.type(), C2NumberStreamTuning::output::typeIndex);
1323875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1324875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2Param::BaseIndex index = C2NumberStreamTuning::input::typeIndex;
1325875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(index.isVendor());
1326875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(index.isFlexible());
1327875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.baseIndex(), kParamIndexNumber);
1328875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.paramIndex(), kParamIndexNumber);
1329875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1330875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        index = C2NumberStreamTuning::output::typeIndex;
1331875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(index.isVendor());
1332875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(index.isFlexible());
1333875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.baseIndex(), kParamIndexNumber);
1334875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.paramIndex(), kParamIndexNumber);
1335875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1336875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2Param::Type type = C2NumberStreamTuning::input::typeIndex;
1337875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isVendor());
1338875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isFlexible());
1339875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isGlobal());
1340875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.forInput());
1341875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forOutput());
1342875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.forStream());
1343875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forPort());
1344875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1345875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        type = C2NumberStreamTuning::output::typeIndex;
1346875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isVendor());
1347875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isFlexible());
1348875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isGlobal());
1349875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forInput());
1350875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.forOutput());
1351875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.forStream());
1352875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forPort());
1353875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1354875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::From(nullptr), nullptr);
1355875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::input::From(nullptr), nullptr);
1356875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::output::From(nullptr), nullptr);
1357875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberTuning::From(&ins1), nullptr);
1358875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberTuning::From(&ins2), nullptr);
1359875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberTuning::From(&outs1), nullptr);
1360875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberTuning::From(&outs2), nullptr);
1361875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::From(&ins1), nullptr);
1362875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::From(&ins2), nullptr);
1363875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::From(&outs1), nullptr);
1364875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::From(&outs2), nullptr);
1365875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::input::From(&ins1), nullptr);
1366875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::input::From(&ins2), nullptr);
1367875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::input::From(&outs1), nullptr);
1368875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::input::From(&outs2), nullptr);
1369875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::output::From(&ins1), nullptr);
1370875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::output::From(&ins2), nullptr);
1371875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::output::From(&outs1), nullptr);
1372875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberPortTuning::output::From(&outs2), nullptr);
1373875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::From(&ins1), &ins1);
1374875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::From(&ins2), (C2NumberStreamTuning*)&ins2);
1375875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::From(&outs1), &outs1);
1376875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::From(&outs2), (C2NumberStreamTuning*)&outs2);
1377875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::input::From(&ins1), (C2NumberStreamTuning::input*)&ins1);
1378875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::input::From(&ins2), &ins2);
1379875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::input::From(&outs1), nullptr);
1380875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::input::From(&outs2), nullptr);
1381875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::output::From(&ins1), nullptr);
1382875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::output::From(&ins2), nullptr);
1383875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::output::From(&outs1), (C2NumberStreamTuning::output*)&outs1);
1384875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumberStreamTuning::output::From(&outs2), &outs2);
1385875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1386875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
1387875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1388875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    {
1389875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        uint32_t videoWidth[] = { 12u, C2NumberStreamTuning::output::typeIndex, 100 };
1390875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2Param *p1 = C2Param::From(videoWidth, sizeof(videoWidth));
1391875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_NE(p1, nullptr);
1392875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(12u, p1->size());
1393875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(p1->type(), C2NumberStreamTuning::output::typeIndex);
1394875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1395875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        p1 = C2Param::From(videoWidth, sizeof(videoWidth) + 2);
1396875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(p1, nullptr);
1397875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1398875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        p1 = C2Param::From(videoWidth, sizeof(videoWidth) - 2);
1399875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(p1, nullptr);
1400875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1401875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        p1 = C2Param::From(videoWidth, 3);
1402875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(p1, nullptr);
1403875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1404875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        p1 = C2Param::From(videoWidth, 0);
1405875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(p1, nullptr);
1406875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
1407875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
1408875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1409875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarvoid StaticTestAddBaseIndex() {
1410875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    struct nobase {};
1411875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    struct base { enum : uint32_t { baseIndex = 1 }; };
1412875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2AddBaseIndex<nobase, 2>::baseIndex == 2, "should be 2");
1413875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static_assert(C2AddBaseIndex<base, 1>::baseIndex == 1, "should be 1");
1414875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
1415875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1416875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarclass TestFlexHelper {
1417875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    struct _Flex {
1418875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        int32_t a;
1419875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        char b[];
1420875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        _Flex() {}
1421875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        FLEX(_Flex, b);
1422875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    };
1423875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1424875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    struct _BoFlex {
1425875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        _Flex a;
1426875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        _BoFlex() {}
1427875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        FLEX(_BoFlex, a);
1428875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    };
1429875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1430875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    struct _NonFlex {
1431875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    };
1432875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1433875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1434875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    static void StaticTest() {
1435875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(std::is_same<_C2FlexHelper<char>::flexType, void>::value, "should be void");
1436875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(std::is_same<_C2FlexHelper<char[]>::flexType, char>::value, "should be char");
1437875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(std::is_same<_C2FlexHelper<_Flex>::flexType, char>::value, "should be char");
1438875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1439875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(std::is_same<_C2FlexHelper<_BoFlex>::flexType, char>::value, "should be void");
1440875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1441875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(_C2Flexible<_Flex>::value, "should be flexible");
1442875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(!_C2Flexible<_NonFlex>::value, "should not be flexible");
1443875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
1444875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
1445875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1446875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarTEST_F(C2ParamTest, FlexParamOpsTest) {
1447875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar//    const C2NumbersStruct str{100};
1448875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2NumbersStruct bstr;
1449875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    {
1450875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar//        EXPECT_EQ(100, str->m.mNumbers[0]);
1451875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        (void)&bstr.mNumbers[0];
1452875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1453875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2Param::BaseIndex index = C2NumbersStruct::baseIndex;
1454875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(index.isVendor());
1455875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(index.isFlexible());
1456875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.baseIndex(), kParamIndexNumbers | C2Param::BaseIndex::_kFlexibleFlag);
1457875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.paramIndex(), kParamIndexNumbers);
1458875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
1459875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1460875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::unique_ptr<C2NumbersTuning> tun_ = C2NumbersTuning::alloc_unique(1);
1461875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    tun_->m.mNumbers[0] = 100;
1462875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::unique_ptr<const C2NumbersTuning> tun = std::move(tun_);
1463875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::shared_ptr<C2NumbersTuning> btun = C2NumbersTuning::alloc_shared(1);
1464875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1465875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    {
1466875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        // flags & invariables
1467875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        const C2NumbersTuning *T[] = { tun.get(), btun.get() };
1468875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto p : T) {
1469875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE((bool)(*p));
1470875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(!(*p));
1471875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(12u, p->size());
1472875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1473875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->isVendor());
1474875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p->isFlexible());
1475875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p->isGlobal());
1476875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->forInput());
1477875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->forOutput());
1478875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->forStream());
1479875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->forPort());
1480875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1481875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1482875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        // value
1483875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(100, tun->m.mNumbers[0]);
1484875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, btun->m.mNumbers[0]);
1485875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(*tun == *btun);
1486875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(tun->operator==(*btun));
1487875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*tun != *btun);
1488875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(tun->operator!=(*btun));
1489875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        btun->m.mNumbers[0] = 100;
1490875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(*tun, *btun);
1491875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1492875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        // index
1493875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(tun->type()).baseIndex(), C2NumbersStruct::baseIndex);
1494875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(tun->type()).paramIndex(), kParamIndexNumbers);
1495875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(tun->type(), C2NumbersTuning::typeIndex);
1496875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(tun->stream(), ~0u);
1497875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1498875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2Param::BaseIndex index = C2NumbersTuning::baseIndex;
1499875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(index.isVendor());
1500875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(index.isFlexible());
1501875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.baseIndex(), kParamIndexNumbers | C2Param::BaseIndex::_kFlexibleFlag);
1502875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.paramIndex(), kParamIndexNumbers);
1503875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1504875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2Param::Type type = C2NumbersTuning::typeIndex;
1505875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isVendor());
1506875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.isFlexible());
1507875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.isGlobal());
1508875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forInput());
1509875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forOutput());
1510875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forStream());
1511875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forPort());
1512875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1513875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersTuning::From(nullptr), nullptr);
1514875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersTuning::From(tun.get()), tun.get());
1515875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::From(tun.get()), nullptr);
1516875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::input::From(tun.get()), nullptr);
1517875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::output::From(tun.get()), nullptr);
1518875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::From(tun.get()), nullptr);
1519875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::input::From(tun.get()), nullptr);
1520875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::output::From(tun.get()), nullptr);
1521875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
1522875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1523875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::unique_ptr<C2NumbersPortTuning> outp1_(C2NumbersPortTuning::alloc_unique(1, true)),
1524875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            inp1_ = C2NumbersPortTuning::alloc_unique(1, false);
1525875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    outp1_->m.mNumbers[0] = 100;
1526875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    inp1_->m.mNumbers[0] = 100;
1527875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::unique_ptr<const C2NumbersPortTuning> outp1 = std::move(outp1_);
1528875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::unique_ptr<const C2NumbersPortTuning> inp1 = std::move(inp1_);
1529875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::shared_ptr<C2NumbersPortTuning> boutp1(C2NumbersPortTuning::alloc_shared(1)),
1530875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            binp1 = C2NumbersPortTuning::alloc_shared(1),
1531875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            binp3 = C2NumbersPortTuning::alloc_shared(1, false);
1532875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    binp3->m.mNumbers[0] = 100;
1533875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::unique_ptr<C2NumbersPortTuning::input> inp2_(C2NumbersPortTuning::input::alloc_unique(1));
1534875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    inp2_->m.mNumbers[0] = 100;
1535875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::unique_ptr<const C2NumbersPortTuning::input> inp2 = std::move(inp2_);
1536875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::shared_ptr<C2NumbersPortTuning::input> binp2(C2NumbersPortTuning::input::alloc_shared(1));
1537875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::unique_ptr<C2NumbersPortTuning::output> outp2_(C2NumbersPortTuning::output::alloc_unique(1));
1538875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    outp2_->m.mNumbers[0] = 100;
1539875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::unique_ptr<const C2NumbersPortTuning::output> outp2 = std::move(outp2_);
1540875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::shared_ptr<C2NumbersPortTuning::output> boutp2(C2NumbersPortTuning::output::alloc_shared(1));
1541875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1542875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    {
1543875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(canCallSetPort(*binp3), "should be able to");
1544875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(canCallSetPort(*binp1), "should be able to");
1545875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(!canCallSetPort(*inp1), "should not be able to (const)");
1546875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(!canCallSetPort(*inp2), "should not be able to (const & type)");
1547875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(!canCallSetPort(*binp2), "should not be able to (type)");
1548875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1549875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        // flags & invariables
1550875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        const C2NumbersPortTuning *P[] = { outp1.get(), inp1.get(), boutp1.get() };
1551875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto p : P) {
1552875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(12u, p->size());
1553875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->isVendor());
1554875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p->isFlexible());
1555875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->isGlobal());
1556875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->forStream());
1557875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p->forPort());
1558875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1559875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        const C2NumbersPortTuning::input *PI[] = { inp2.get(), binp2.get() };
1560875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto p : PI) {
1561875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(12u, p->size());
1562875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->isVendor());
1563875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p->isFlexible());
1564875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->isGlobal());
1565875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->forStream());
1566875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p->forPort());
1567875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1568875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        const C2NumbersPortTuning::output *PO[] = { outp2.get(), boutp2.get() };
1569875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto p : PO) {
1570875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(12u, p->size());
1571875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->isVendor());
1572875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p->isFlexible());
1573875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->isGlobal());
1574875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->forStream());
1575875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p->forPort());
1576875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1577875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1578875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        // port specific flags & invariables
1579875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(outp1->forInput());
1580875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(outp1->forOutput());
1581875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1582875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(inp1->forInput());
1583875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(inp1->forOutput());
1584875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1585875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        const C2NumbersPortTuning *P2[] = { outp1.get(), inp1.get() };
1586875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto p : P2) {
1587875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE((bool)(*p));
1588875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(!(*p));
1589875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(100, p->m.mNumbers[0]);
1590875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1591875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto p : PO) {
1592875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE((bool)(*p));
1593875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(!(*p));
1594875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1595875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->forInput());
1596875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p->forOutput());
1597875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1598875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto p : PI) {
1599875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE((bool)(*p));
1600875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(!(*p));
1601875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1602875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p->forInput());
1603875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->forOutput());
1604875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1605875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        const C2NumbersPortTuning *P3[] = { boutp1.get() };
1606875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto p : P3) {
1607875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE((bool)(*p));
1608875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(!(*p));
1609875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1610875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->forInput());
1611875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->forOutput());
1612875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(0, p->m.mNumbers[0]);
1613875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1614875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1615875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        // values
1616875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(100, inp2->m.mNumbers[0]);
1617875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(100, outp2->m.mNumbers[0]);
1618875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, binp1->m.mNumbers[0]);
1619875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, binp2->m.mNumbers[0]);
1620875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, boutp1->m.mNumbers[0]);
1621875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, boutp2->m.mNumbers[0]);
1622875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1623875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*inp1 != *outp1);
1624875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*inp1 == *inp2);
1625875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*outp1 == *outp2);
1626875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*binp1 == *boutp1);
1627875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*binp2 != *boutp2);
1628875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1629875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*inp1 != *binp1);
1630875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        binp1->m.mNumbers[0] = 100;
1631875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*inp1 != *binp1);
1632875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        binp1->setPort(false /* output */);
1633875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE((bool)*binp1);
1634875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(!*binp1);
1635875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*inp1 == *binp1);
1636875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1637875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*inp2 != *binp2);
1638875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        binp2->m.mNumbers[0] = 100;
1639875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*inp2 == *binp2);
1640875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1641875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        binp1->setPort(true /* output */);
1642875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*outp1 == *binp1);
1643875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1644875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*outp1 != *boutp1);
1645875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        boutp1->m.mNumbers[0] = 100;
1646875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*outp1 != *boutp1);
1647875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        boutp1->setPort(true /* output */);
1648875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE((bool)*boutp1);
1649875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(!*boutp1);
1650875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*outp1 == *boutp1);
1651875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1652875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*outp2 != *boutp2);
1653875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        boutp2->m.mNumbers[0] = 100;
1654875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*outp2 == *boutp2);
1655875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1656875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        boutp1->setPort(false /* output */);
1657875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*inp1 == *boutp1);
1658875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1659875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        // index
1660875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(inp1->type()).baseIndex(), C2NumbersStruct::baseIndex);
1661875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(inp1->type()).paramIndex(), kParamIndexNumbers);
1662875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(inp1->type(), C2NumbersPortTuning::input::typeIndex);
1663875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(inp1->stream(), ~0u);
1664875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1665875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(inp2->type()).baseIndex(), C2NumbersStruct::baseIndex);
1666875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(inp2->type()).paramIndex(), kParamIndexNumbers);
1667875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(inp2->type(), C2NumbersPortTuning::input::typeIndex);
1668875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(inp2->stream(), ~0u);
1669875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1670875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(outp1->type()).baseIndex(), C2NumbersStruct::baseIndex);
1671875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(outp1->type()).paramIndex(), kParamIndexNumbers);
1672875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(outp1->type(), C2NumbersPortTuning::output::typeIndex);
1673875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(outp1->stream(), ~0u);
1674875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1675875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(outp2->type()).baseIndex(), C2NumbersStruct::baseIndex);
1676875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(outp2->type()).paramIndex(), kParamIndexNumbers);
1677875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(outp2->type(), C2NumbersPortTuning::output::typeIndex);
1678875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(outp2->stream(), ~0u);
1679875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1680875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2Param::BaseIndex index = C2NumbersPortTuning::input::typeIndex;
1681875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(index.isVendor());
1682875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(index.isFlexible());
1683875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.baseIndex(), kParamIndexNumbers | C2Param::BaseIndex::_kFlexibleFlag);
1684875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.paramIndex(), kParamIndexNumbers);
1685875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1686875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        index = C2NumbersPortTuning::output::typeIndex;
1687875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(index.isVendor());
1688875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(index.isFlexible());
1689875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.baseIndex(), kParamIndexNumbers | C2Param::BaseIndex::_kFlexibleFlag);
1690875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.paramIndex(), kParamIndexNumbers);
1691875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1692875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2Param::Type type = C2NumbersPortTuning::input::typeIndex;
1693875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isVendor());
1694875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.isFlexible());
1695875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isGlobal());
1696875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.forInput());
1697875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forOutput());
1698875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forStream());
1699875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.forPort());
1700875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1701875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        type = C2NumbersPortTuning::output::typeIndex;
1702875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isVendor());
1703875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.isFlexible());
1704875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isGlobal());
1705875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forInput());
1706875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.forOutput());
1707875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forStream());
1708875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.forPort());
1709875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1710875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::From(nullptr), nullptr);
1711875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::input::From(nullptr), nullptr);
1712875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::output::From(nullptr), nullptr);
1713875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersTuning::From(inp1.get()), nullptr);
1714875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersTuning::From(inp2.get()), nullptr);
1715875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersTuning::From(outp1.get()), nullptr);
1716875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersTuning::From(outp2.get()), nullptr);
1717875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::From(inp1.get()), inp1.get());
1718875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::From(inp2.get()), (C2NumbersPortTuning*)inp2.get());
1719875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::From(outp1.get()), outp1.get());
1720875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::From(outp2.get()), (C2NumbersPortTuning*)outp2.get());
1721875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::input::From(inp1.get()), (C2NumbersPortTuning::input*)inp1.get());
1722875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::input::From(inp2.get()), inp2.get());
1723875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::input::From(outp1.get()), nullptr);
1724875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::input::From(outp2.get()), nullptr);
1725875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::output::From(inp1.get()), nullptr);
1726875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::output::From(inp2.get()), nullptr);
1727875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::output::From(outp1.get()), (C2NumbersPortTuning::output*)outp1.get());
1728875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::output::From(outp2.get()), outp2.get());
1729875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::From(inp1.get()), nullptr);
1730875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::From(inp2.get()), nullptr);
1731875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::From(outp1.get()), nullptr);
1732875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::From(outp2.get()), nullptr);
1733875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::input::From(inp1.get()), nullptr);
1734875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::input::From(inp2.get()), nullptr);
1735875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::input::From(outp1.get()), nullptr);
1736875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::input::From(outp2.get()), nullptr);
1737875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::output::From(inp1.get()), nullptr);
1738875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::output::From(inp2.get()), nullptr);
1739875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::output::From(outp1.get()), nullptr);
1740875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::output::From(outp2.get()), nullptr);
1741875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1742875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
1743875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1744875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::unique_ptr<C2NumbersStreamTuning> outs1_(C2NumbersStreamTuning::alloc_unique(1, true, 1u));
1745875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    outs1_->m.mNumbers[0] = 100;
1746875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::unique_ptr<const C2NumbersStreamTuning> outs1 = std::move(outs1_);
1747875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::unique_ptr<C2NumbersStreamTuning> ins1_(C2NumbersStreamTuning::alloc_unique(1, false, 1u));
1748875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    ins1_->m.mNumbers[0] = 100;
1749875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::unique_ptr<const C2NumbersStreamTuning> ins1 = std::move(ins1_);
1750875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::shared_ptr<C2NumbersStreamTuning> bouts1(C2NumbersStreamTuning::alloc_shared(1));
1751875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::shared_ptr<C2NumbersStreamTuning> bins1(C2NumbersStreamTuning::alloc_shared(1));
1752875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::shared_ptr<C2NumbersStreamTuning> bins3(C2NumbersStreamTuning::alloc_shared(1, false, 1u));
1753875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    bins3->m.mNumbers[0] = 100;
1754875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::unique_ptr<C2NumbersStreamTuning::input> ins2_(C2NumbersStreamTuning::input::alloc_unique(1, 1u));
1755875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    ins2_->m.mNumbers[0] = 100;
1756875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::unique_ptr<const C2NumbersStreamTuning::input> ins2 = std::move(ins2_);
1757875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::shared_ptr<C2NumbersStreamTuning::input> bins2(C2NumbersStreamTuning::input::alloc_shared(1));
1758875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::unique_ptr<C2NumbersStreamTuning::output> outs2_(C2NumbersStreamTuning::output::alloc_unique(1, 1u));
1759875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    outs2_->m.mNumbers[0] = 100;
1760875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::unique_ptr<const C2NumbersStreamTuning::output> outs2 = std::move(outs2_);
1761875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::shared_ptr<C2NumbersStreamTuning::output> bouts2(C2NumbersStreamTuning::output::alloc_shared(1));
1762875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1763875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    {
1764875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(canCallSetPort(*bins3), "should be able to");
1765875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(canCallSetPort(*bins1), "should be able to");
1766875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(!canCallSetPort(*ins1), "should not be able to (const)");
1767875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(!canCallSetPort(*ins2), "should not be able to (const & type)");
1768875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(!canCallSetPort(*bins2), "should not be able to (type)");
1769875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1770875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        // flags & invariables
1771875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        const C2NumbersStreamTuning *S[] = { outs1.get(), ins1.get(), bouts1.get() };
1772875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto p : S) {
1773875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(12u, p->size());
1774875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->isVendor());
1775875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p->isFlexible());
1776875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->isGlobal());
1777875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p->forStream());
1778875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->forPort());
1779875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1780875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        const C2NumbersStreamTuning::input *SI[] = { ins2.get(), bins2.get() };
1781875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto p : SI) {
1782875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(12u, p->size());
1783875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->isVendor());
1784875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p->isFlexible());
1785875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->isGlobal());
1786875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p->forStream());
1787875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->forPort());
1788875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1789875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        const C2NumbersStreamTuning::output *SO[] = { outs2.get(), bouts2.get() };
1790875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto p : SO) {
1791875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(12u, p->size());
1792875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->isVendor());
1793875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p->isFlexible());
1794875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->isGlobal());
1795875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p->forStream());
1796875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->forPort());
1797875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1798875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1799875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        // port specific flags & invariables
1800875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(outs1->forInput());
1801875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(outs1->forOutput());
1802875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1803875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(ins1->forInput());
1804875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(ins1->forOutput());
1805875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1806875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        const C2NumbersStreamTuning *S2[] = { outs1.get(), ins1.get() };
1807875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto p : S2) {
1808875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE((bool)(*p));
1809875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(!(*p));
1810875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(100, p->m.mNumbers[0]);
1811875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(1u, p->stream());
1812875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1813875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto p : SO) {
1814875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE((bool)(*p));
1815875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(!(*p));
1816875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1817875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->forInput());
1818875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p->forOutput());
1819875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1820875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto p : SI) {
1821875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE((bool)(*p));
1822875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(!(*p));
1823875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1824875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(p->forInput());
1825875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->forOutput());
1826875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1827875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        const C2NumbersStreamTuning *S3[] = { bouts1.get() };
1828875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const auto p : S3) {
1829875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE((bool)(*p));
1830875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_TRUE(!(*p));
1831875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1832875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->forInput());
1833875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_FALSE(p->forOutput());
1834875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(0, p->m.mNumbers[0]);
1835875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
1836875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1837875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        // values
1838875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(100, ins2->m.mNumbers[0]);
1839875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(100, outs2->m.mNumbers[0]);
1840875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, bins1->m.mNumbers[0]);
1841875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, bins2->m.mNumbers[0]);
1842875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, bouts1->m.mNumbers[0]);
1843875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, bouts2->m.mNumbers[0]);
1844875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1845875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(1u, ins2->stream());
1846875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(1u, outs2->stream());
1847875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0u, bins1->stream());
1848875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0u, bins2->stream());
1849875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0u, bouts1->stream());
1850875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0u, bouts2->stream());
1851875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1852875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*ins1 != *outs1);
1853875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*ins1 == *ins2);
1854875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*outs1 == *outs2);
1855875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*bins1 == *bouts1);
1856875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*bins2 != *bouts2);
1857875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1858875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*ins1 != *bins1);
1859875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bins1->m.mNumbers[0] = 100;
1860875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*ins1 != *bins1);
1861875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bins1->setPort(false /* output */);
1862875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*ins1 != *bins1);
1863875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bins1->setStream(1u);
1864875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*ins1 == *bins1);
1865875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1866875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*ins2 != *bins2);
1867875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bins2->m.mNumbers[0] = 100;
1868875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*ins2 != *bins2);
1869875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bins2->setStream(1u);
1870875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*ins2 == *bins2);
1871875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1872875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bins1->setPort(true /* output */);
1873875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*outs1 == *bins1);
1874875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1875875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*outs1 != *bouts1);
1876875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bouts1->m.mNumbers[0] = 100;
1877875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*outs1 != *bouts1);
1878875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bouts1->setPort(true /* output */);
1879875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*outs1 != *bouts1);
1880875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bouts1->setStream(1u);
1881875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*outs1 == *bouts1);
1882875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1883875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*outs2 != *bouts2);
1884875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bouts2->m.mNumbers[0] = 100;
1885875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*outs2 != *bouts2);
1886875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bouts2->setStream(1u);
1887875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*outs2 == *bouts2);
1888875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1889875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        bouts1->setPort(false /* output */);
1890875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(*ins1 == *bouts1);
1891875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1892875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        // index
1893875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(ins1->type()).baseIndex(), C2NumbersStruct::baseIndex);
1894875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(ins1->type()).paramIndex(), kParamIndexNumbers);
1895875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(ins1->type(), C2NumbersStreamTuning::input::typeIndex);
1896875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1897875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(ins2->type()).baseIndex(), C2NumbersStruct::baseIndex);
1898875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(ins2->type()).paramIndex(), kParamIndexNumbers);
1899875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(ins2->type(), C2NumbersStreamTuning::input::typeIndex);
1900875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1901875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(outs1->type()).baseIndex(), C2NumbersStruct::baseIndex);
1902875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(outs1->type()).paramIndex(), kParamIndexNumbers);
1903875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(outs1->type(), C2NumbersStreamTuning::output::typeIndex);
1904875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1905875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(outs2->type()).baseIndex(), C2NumbersStruct::baseIndex);
1906875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2Param::Type(outs2->type()).paramIndex(), kParamIndexNumbers);
1907875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(outs2->type(), C2NumbersStreamTuning::output::typeIndex);
1908875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1909875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2Param::BaseIndex index = C2NumbersStreamTuning::input::typeIndex;
1910875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(index.isVendor());
1911875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(index.isFlexible());
1912875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.baseIndex(), kParamIndexNumbers | C2Param::BaseIndex::_kFlexibleFlag);
1913875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.paramIndex(), kParamIndexNumbers);
1914875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1915875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        index = C2NumbersStreamTuning::output::typeIndex;
1916875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(index.isVendor());
1917875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(index.isFlexible());
1918875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.baseIndex(), kParamIndexNumbers | C2Param::BaseIndex::_kFlexibleFlag);
1919875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(index.paramIndex(), kParamIndexNumbers);
1920875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1921875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2Param::Type type = C2NumbersStreamTuning::input::typeIndex;
1922875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isVendor());
1923875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.isFlexible());
1924875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isGlobal());
1925875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.forInput());
1926875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forOutput());
1927875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.forStream());
1928875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forPort());
1929875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1930875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        type = C2NumbersStreamTuning::output::typeIndex;
1931875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isVendor());
1932875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.isFlexible());
1933875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.isGlobal());
1934875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forInput());
1935875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.forOutput());
1936875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_TRUE(type.forStream());
1937875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_FALSE(type.forPort());
1938875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1939875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::From(nullptr), nullptr);
1940875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::input::From(nullptr), nullptr);
1941875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::output::From(nullptr), nullptr);
1942875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersTuning::From(ins1.get()), nullptr);
1943875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersTuning::From(ins2.get()), nullptr);
1944875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersTuning::From(outs1.get()), nullptr);
1945875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersTuning::From(outs2.get()), nullptr);
1946875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::From(ins1.get()), nullptr);
1947875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::From(ins2.get()), nullptr);
1948875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::From(outs1.get()), nullptr);
1949875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::From(outs2.get()), nullptr);
1950875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::input::From(ins1.get()), nullptr);
1951875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::input::From(ins2.get()), nullptr);
1952875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::input::From(outs1.get()), nullptr);
1953875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::input::From(outs2.get()), nullptr);
1954875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::output::From(ins1.get()), nullptr);
1955875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::output::From(ins2.get()), nullptr);
1956875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::output::From(outs1.get()), nullptr);
1957875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::output::From(outs2.get()), nullptr);
1958875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::From(ins1.get()), ins1.get());
1959875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::From(ins2.get()), (C2NumbersStreamTuning*)ins2.get());
1960875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::From(outs1.get()), outs1.get());
1961875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::From(outs2.get()), (C2NumbersStreamTuning*)outs2.get());
1962875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::input::From(ins1.get()), (C2NumbersStreamTuning::input*)ins1.get());
1963875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::input::From(ins2.get()), ins2.get());
1964875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::input::From(outs1.get()), nullptr);
1965875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::input::From(outs2.get()), nullptr);
1966875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::output::From(ins1.get()), nullptr);
1967875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::output::From(ins2.get()), nullptr);
1968875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::output::From(outs1.get()), (C2NumbersStreamTuning::output*)outs1.get());
1969875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::output::From(outs2.get()), outs2.get());
1970875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1971875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
1972875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1973875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    {
1974875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2Int32Value int32Value(INT32_MIN);
1975875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(std::is_same<decltype(int32Value.mValue), int32_t>::value, "should be int32_t");
1976875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(INT32_MIN, int32Value.mValue);
1977875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        std::list<const C2FieldDescriptor> fields = int32Value.fieldList;
1978875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(1u, fields.size());
1979875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(FD::INT32, fields.cbegin()->type());
1980875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(1u, fields.cbegin()->length());
1981875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2String("value"), fields.cbegin()->name());
1982875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
1983875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1984875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    {
1985875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2Uint32Value uint32Value(UINT32_MAX);
1986875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(std::is_same<decltype(uint32Value.mValue), uint32_t>::value, "should be uint32_t");
1987875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(UINT32_MAX, uint32Value.mValue);
1988875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        std::list<const C2FieldDescriptor> fields = uint32Value.fieldList;
1989875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(1u, fields.size());
1990875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(FD::UINT32, fields.cbegin()->type());
1991875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(1u, fields.cbegin()->length());
1992875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2String("value"), fields.cbegin()->name());
1993875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
1994875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
1995875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    {
1996875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2Int64Value int64Value(INT64_MIN);
1997875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(std::is_same<decltype(int64Value.mValue), int64_t>::value, "should be int64_t");
1998875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(INT64_MIN, int64Value.mValue);
1999875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        std::list<const C2FieldDescriptor> fields = int64Value.fieldList;
2000875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(1u, fields.size());
2001875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(FD::INT64, fields.cbegin()->type());
2002875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(1u, fields.cbegin()->length());
2003875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2String("value"), fields.cbegin()->name());
2004875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2005875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2006875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    {
2007875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2Uint64Value uint64Value(UINT64_MAX);
2008875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(std::is_same<decltype(uint64Value.mValue), uint64_t>::value, "should be uint64_t");
2009875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(UINT64_MAX, uint64Value.mValue);
2010875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        std::list<const C2FieldDescriptor> fields = uint64Value.fieldList;
2011875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(1u, fields.size());
2012875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(FD::UINT64, fields.cbegin()->type());
2013875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(1u, fields.cbegin()->length());
2014875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2String("value"), fields.cbegin()->name());
2015875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2016875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2017875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    {
2018875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2FloatValue floatValue(123.4f);
2019875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(std::is_same<decltype(floatValue.mValue), float>::value, "should be float");
2020875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(123.4f, floatValue.mValue);
2021875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        std::list<const C2FieldDescriptor> fields = floatValue.fieldList;
2022875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(1u, fields.size());
2023875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(FD::FLOAT, fields.cbegin()->type());
2024875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(1u, fields.cbegin()->length());
2025875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2String("value"), fields.cbegin()->name());
2026875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2027875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2028875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    {
2029875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        uint8_t initValue[] = "ABCD";
2030875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        typedef C2GlobalParam<C2Setting, C2BlobValue, 0> BlobSetting;
2031875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        std::unique_ptr<BlobSetting> blobValue = BlobSetting::alloc_unique(6, C2ConstMemoryBlock<uint8_t>(initValue));
2032875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(std::is_same<decltype(blobValue->m.mValue), uint8_t[]>::value, "should be uint8_t[]");
2033875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, memcmp(blobValue->m.mValue, "ABCD\0", 6));
2034875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(6u, blobValue->flexCount());
2035875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        std::list<const C2FieldDescriptor> fields = blobValue->fieldList;
2036875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(1u, fields.size());
2037875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(FD::BLOB, fields.cbegin()->type());
2038875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0u, fields.cbegin()->length());
2039875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2String("value"), fields.cbegin()->name());
2040875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2041875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        blobValue = BlobSetting::alloc_unique(3, C2ConstMemoryBlock<uint8_t>(initValue));
2042875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, memcmp(blobValue->m.mValue, "ABC", 3));
2043875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(3u, blobValue->flexCount());
2044875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2045875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2046875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    {
2047875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        constexpr char initValue[] = "ABCD";
2048875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        typedef C2GlobalParam<C2Setting, C2StringValue, 0> StringSetting;
2049875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        std::unique_ptr<StringSetting> stringValue = StringSetting::alloc_unique(6, C2ConstMemoryBlock<char>(initValue));
2050875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        stringValue = StringSetting::alloc_unique(6, initValue);
2051875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        static_assert(std::is_same<decltype(stringValue->m.mValue), char[]>::value, "should be char[]");
2052875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, memcmp(stringValue->m.mValue, "ABCD\0", 6));
2053875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(6u, stringValue->flexCount());
2054875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        std::list<const C2FieldDescriptor> fields = stringValue->fieldList;
2055875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(1u, fields.size());
2056875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(FD::STRING, fields.cbegin()->type());
2057875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0u, fields.cbegin()->length());
2058875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2String("value"), fields.cbegin()->name());
2059875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2060875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        stringValue = StringSetting::alloc_unique(3, C2ConstMemoryBlock<char>(initValue));
2061875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, memcmp(stringValue->m.mValue, "AB", 3));
2062875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(3u, stringValue->flexCount());
2063875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2064875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        stringValue = StringSetting::alloc_unique(11, "initValue");
2065875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, memcmp(stringValue->m.mValue, "initValue\0", 11));
2066875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(11u, stringValue->flexCount());
2067875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2068875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        stringValue = StringSetting::alloc_unique(initValue);
2069875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, memcmp(stringValue->m.mValue, "ABCD", 5));
2070875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(5u, stringValue->flexCount());
2071875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2072875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        stringValue = StringSetting::alloc_unique({ 'A', 'B', 'C', 'D' });
2073875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(0, memcmp(stringValue->m.mValue, "ABC", 4));
2074875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(4u, stringValue->flexCount());
2075875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2076875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2077875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    {
2078875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        uint32_t videoWidth[] = { 12u, C2NumbersStreamTuning::output::typeIndex, 100 };
2079875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2Param *p1 = C2Param::From(videoWidth, sizeof(videoWidth));
2080875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_NE(nullptr, p1);
2081875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(12u, p1->size());
2082875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersStreamTuning::output::typeIndex, p1->type());
2083875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2084875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2NumbersStreamTuning::output *vst = C2NumbersStreamTuning::output::From(p1);
2085875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_NE(nullptr, vst);
2086875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        if (vst) {
2087875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(1u, vst->flexCount());
2088875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(100, vst->m.mNumbers[0]);
2089875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
2090875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2091875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        p1 = C2Param::From(videoWidth, sizeof(videoWidth) + 2);
2092875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(nullptr, p1);
2093875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2094875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        p1 = C2Param::From(videoWidth, sizeof(videoWidth) - 2);
2095875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(nullptr, p1);
2096875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2097875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        p1 = C2Param::From(videoWidth, 3);
2098875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(nullptr, p1);
2099875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2100875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        p1 = C2Param::From(videoWidth, 0);
2101875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(nullptr, p1);
2102875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2103875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2104875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    {
2105875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        uint32_t videoWidth[] = { 16u, C2NumbersPortTuning::input::typeIndex, 101, 102 };
2106875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2107875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2Param *p1 = C2Param::From(videoWidth, sizeof(videoWidth));
2108875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_NE(nullptr, p1);
2109875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(16u, p1->size());
2110875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(C2NumbersPortTuning::input::typeIndex, p1->type());
2111875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2112875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2NumbersPortTuning::input *vpt = C2NumbersPortTuning::input::From(p1);
2113875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_NE(nullptr, vpt);
2114875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        if (vpt) {
2115875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(2u, vpt->flexCount());
2116875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(101, vpt->m.mNumbers[0]);
2117875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            EXPECT_EQ(102, vpt->m.mNumbers[1]);
2118875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
2119875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2120875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        p1 = C2Param::From(videoWidth, sizeof(videoWidth) + 2);
2121875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(nullptr, p1);
2122875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2123875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        p1 = C2Param::From(videoWidth, sizeof(videoWidth) - 2);
2124875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(nullptr, p1);
2125875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2126875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        p1 = C2Param::From(videoWidth, 3);
2127875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(nullptr, p1);
2128875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2129875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        p1 = C2Param::From(videoWidth, 0);
2130875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        EXPECT_EQ(nullptr, p1);
2131875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2132875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
2133875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2134875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar// ***********************
2135875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2136875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
2137875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2138875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar#include <util/C2ParamUtils.h>
2139875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar#include <C2Config.h>
2140875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar#include <C2Component.h>
2141875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar#include <unordered_map>
2142875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2143875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarnamespace android {
2144875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2145875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarC2ENUM(
2146875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    MetadataType, int32_t,
2147875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    kInvalid = -1,
2148875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    kNone = 0,
2149875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    kGralloc,
2150875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    kNativeHandle,
2151875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    kANativeWindow,
2152875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    kCamera,
2153875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar)
2154875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2155875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarenum {
2156875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    kParamIndexVideoConfig = 0x1234,
2157875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
2158875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2159875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct C2VideoConfigStruct {
2160875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t mWidth;
2161875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    uint32_t mHeight;
2162875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    MetadataType mMetadataType;
2163875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t mSupportedFormats[];
2164875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2165875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2VideoConfigStruct() {}
2166875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2167875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    DEFINE_AND_DESCRIBE_FLEX_C2STRUCT(VideoConfig, mSupportedFormats)
2168875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mWidth, "width")
2169875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mHeight, "height")
2170875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mMetadataType, "metadata-type")
2171875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2FIELD(mSupportedFormats, "formats")
2172875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
2173875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2174875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartypedef C2PortParam<C2Tuning, C2VideoConfigStruct> C2VideoConfigPortTuning;
2175875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2176875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarclass MyReflector : public C2ParamReflector {
2177875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarprivate:
2178875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::unique_ptr<C2VideoConfigPortTuning::input> inputVideoConfigTuning;
2179875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::unique_ptr<C2VideoConfigPortTuning::output> outputVideoConfigTuning;
2180875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2181875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarpublic:
2182875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    void describeSupportedValues() {
2183875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2TypedFieldSupportedValues<int32_t> supportedWidths(16, 1920, 8);
2184875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2FieldSupportedValues supportedWidths2(16, 1920, 8);
2185875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2186875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2187875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        std::list<C2FieldSupportedValues> supported;
2188875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        //supported.emplace_push(inputVideoConfigTuning->mNumber, range(16, 1920, 8));
2189875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        //supported.emplace_push(inputVideoConfigTuning->mHeight, range(16, 1088, 8));
2190875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        //supported.emplace_push(inputVideoConfigTuning->mMetadataType, all_enums);
2191875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        //supported.emplace_push(inputVideoConfigTuning->mSupportedFormats, { 0, 1, 5, 7 });
2192875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2193875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2194875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    virtual std::unique_ptr<android::C2StructDescriptor> describe(C2Param::BaseIndex paramType) {
2195875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        switch (paramType.baseIndex()) {
2196875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        case C2VideoConfigPortTuning::baseIndex:
2197875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            return std::unique_ptr<C2StructDescriptor>(new C2StructDescriptor{
2198875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                paramType.baseIndex(),
2199875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                C2VideoConfigPortTuning::fieldList,
2200875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            });
2201875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
2202875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        return nullptr;
2203875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2204875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
2205875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2206875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarclass MyComponentInstance : public C2ComponentInterface {
2207875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarpublic:
2208875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    virtual C2String getName() const {
2209875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        /// \todo this seems too specific
2210875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        return "sample.interface";
2211875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    };
2212875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2213875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    virtual node_id getId() const {
2214875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        /// \todo how are these shared?
2215875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        return 0;
2216875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2217875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2218875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    virtual status_t commit_sm(
2219875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            const std::vector<C2Param* const> &params,
2220875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            std::vector<std::unique_ptr<C2SettingResult>>* const failures) {
2221875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        (void)params;
2222875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        (void)failures;
2223875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        return C2_UNSUPPORTED;
2224875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2225875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2226875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    virtual status_t config_nb(
2227875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            const std::vector<C2Param* const> &params,
2228875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            std::vector<std::unique_ptr<C2SettingResult>>* const failures) {
2229875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        (void)params;
2230875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        (void)failures;
2231875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        return C2_UNSUPPORTED;
2232875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2233875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2234875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    virtual status_t createTunnel_sm(node_id targetComponent) {
2235875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        (void)targetComponent;
2236875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        return C2_UNSUPPORTED;
2237875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2238875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2239875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    virtual status_t query_nb(
2240875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            const std::vector<C2Param* const> &stackParams,
2241875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            const std::vector<C2Param::Index> &heapParamIndices,
2242875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            std::vector<std::unique_ptr<C2Param>>* const heapParams) const {
2243875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (C2Param* const param : stackParams) {
2244875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            if (!*param) { // param is already invalid - remember it
2245875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                continue;
2246875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            }
2247875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2248875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            // note: this does not handle stream params (should use index...)
2249875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            if (!mMyParams.count(param->type())) {
2250875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                continue; // not my param
2251875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            }
2252875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2253875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            C2Param & myParam = mMyParams.find(param->type())->second;
2254875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            if (myParam.size() != param->size()) { // incorrect size
2255875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                param->invalidate();
2256875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                continue;
2257875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            }
2258875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2259875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            param->updateFrom(myParam);
2260875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
2261875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2262875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const C2Param::Index index : heapParamIndices) {
2263875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            if (mMyParams.count(index)) {
2264875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                C2Param & myParam = mMyParams.find(index)->second;
2265875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                std::unique_ptr<C2Param> paramCopy(C2Param::From(&myParam, myParam.size()));
2266875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                heapParams->push_back(std::move(paramCopy));
2267875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            }
2268875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
2269875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2270875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        return C2_OK;
2271875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2272875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2273875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::unordered_map<uint32_t, C2Param &> mMyParams;
2274875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2275875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2ComponentDomainInfo mDomainInfo;
2276875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2277875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    MyComponentInstance() {
2278875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        mMyParams.insert({mDomainInfo.type(), mDomainInfo});
2279875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2280875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2281875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    virtual status_t releaseTunnel_sm(node_id targetComponent) {
2282875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        (void)targetComponent;
2283875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        return C2_UNSUPPORTED;
2284875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2285875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2286875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    class MyParamReflector : public C2ParamReflector {
2287875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        const MyComponentInstance *instance;
2288875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2289875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    public:
2290875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        MyParamReflector(const MyComponentInstance *i) : instance(i) { }
2291875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2292875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        virtual std::unique_ptr<C2StructDescriptor> describe(C2Param::BaseIndex paramIndex) {
2293875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            switch (paramIndex.baseIndex()) {
2294875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            case decltype(instance->mDomainInfo)::baseIndex:
2295875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            default:
2296875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                return std::unique_ptr<C2StructDescriptor>(new C2StructDescriptor{
2297875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                    instance->mDomainInfo.type(),
2298875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                    decltype(instance->mDomainInfo)::fieldList,
2299875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                });
2300875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            }
2301875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            return nullptr;
2302875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
2303875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    };
2304875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2305875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    virtual status_t getSupportedValues(
2306875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            const std::vector<const C2ParamField> fields,
2307875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            std::vector<C2FieldSupportedValues>* const values) const {
2308875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const C2ParamField &field : fields) {
2309875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            if (field == C2ParamField(&mDomainInfo, &C2ComponentDomainInfo::mValue)) {
2310875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                values->push_back(C2FieldSupportedValues(
2311875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                    false /* flag */,
2312875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                    &mDomainInfo.mValue
2313875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                    //,
2314875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                    //{(int32_t)C2DomainVideo}
2315875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                ));
2316875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            }
2317875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
2318875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        return C2_OK;
2319875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2320875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2321875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    virtual std::shared_ptr<C2ParamReflector> getParamReflector() const {
2322875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        return std::shared_ptr<C2ParamReflector>(new MyParamReflector(this));
2323875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2324875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2325875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    virtual status_t getSupportedParams(std::vector<std::shared_ptr<C2ParamDescriptor>> * const params) const {
2326875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        params->push_back(std::make_shared<C2ParamDescriptor>(
2327875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                true /* required */, "_domain", &mDomainInfo));
2328875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        return C2_OK;
2329875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2330875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2331875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    status_t getSupportedParams2(std::vector<std::shared_ptr<C2ParamDescriptor>> * const params) {
2332875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        params->push_back(std::shared_ptr<C2ParamDescriptor>(
2333875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                new C2ParamDescriptor(true /* required */, "_domain", &mDomainInfo)));
2334875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        return C2_OK;
2335875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2336875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2337875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
2338875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2339875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartemplate<typename E, bool S=std::is_enum<E>::value>
2340875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct getter {
2341875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t get(const C2FieldSupportedValues::Primitive &p, int32_t*) {
2342875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        return p.i32;
2343875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2344875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int64_t get(const C2FieldSupportedValues::Primitive &p, int64_t*) {
2345875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        return p.i64;
2346875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2347875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    uint32_t get(const C2FieldSupportedValues::Primitive &p, uint32_t*) {
2348875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        return p.u32;
2349875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2350875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    uint64_t get(const C2FieldSupportedValues::Primitive &p, uint64_t*) {
2351875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        return p.u64;
2352875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2353875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    float get(const C2FieldSupportedValues::Primitive &p, float*) {
2354875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        return p.fp;
2355875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2356875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
2357875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2358875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartemplate<typename E>
2359875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct getter<E, true> {
2360875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar     typename std::underlying_type<E>::type get(const C2FieldSupportedValues::Primitive &p, E*) {
2361875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar         using u=typename std::underlying_type<E>::type;
2362875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar         return getter<u>().get(p, (u*)0);
2363875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar     }
2364875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
2365875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2366875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartemplate<typename T, bool E=std::is_enum<T>::value>
2367875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct lax_underlying_type {
2368875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    typedef typename std::underlying_type<T>::type type;
2369875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
2370875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2371875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartemplate<typename T>
2372875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarstruct lax_underlying_type<T, false> {
2373875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    typedef T type;
2374875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar};
2375875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2376875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartemplate<typename E>
2377875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartypename lax_underlying_type<E>::type get(
2378875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        const C2FieldSupportedValues::Primitive &p, E*) {
2379875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    return getter<E>().get(p, (E*)0);
2380875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
2381875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2382875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnartemplate<typename T>
2383875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarvoid dumpFSV(const C2FieldSupportedValues &sv, T*t) {
2384875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    using namespace std;
2385875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    cout << (std::is_enum<T>::value ? (std::is_signed<typename std::underlying_type<T>::type>::value ? "i" : "u")
2386875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar             : std::is_integral<T>::value ? std::is_signed<T>::value ? "i" : "u" : "f")
2387875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        << (8 * sizeof(T));
2388875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    if (sv.type == sv.RANGE) {
2389875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        cout << ".range(" << get(sv.range.min, t);
2390875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        if (get(sv.range.step, t) != std::is_integral<T>::value) {
2391875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            cout << ":" << get(sv.range.step, t);
2392875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
2393875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        if (get(sv.range.nom, t) != 1 || get(sv.range.denom, t) != 1) {
2394875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            cout << ":" << get(sv.range.nom, t) << "/" << get(sv.range.denom, t);
2395875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
2396875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        cout << get(sv.range.max, t) << ")";
2397875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2398875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    if (sv.values.size()) {
2399875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        cout << (sv.type == sv.FLAGS ? ".flags(" : ".list(");
2400875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        const char *sep = "";
2401875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        for (const C2FieldSupportedValues::Primitive &p : sv.values) {
2402875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            cout << sep << get(p, t);
2403875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            sep = ",";
2404875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
2405875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        cout << ")";
2406875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2407875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    cout << endl;
2408875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
2409875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2410875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarvoid dumpType(C2Param::Type type) {
2411875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    using namespace std;
2412875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    cout << (type.isVendor() ? "Vendor" : "C2");
2413875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    if (type.forInput()) {
2414875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        cout << "Input";
2415875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    } else if (type.forOutput()) {
2416875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        cout << "Output";
2417875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    } else if (type.forPort() && !type.forStream()) {
2418875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        cout << "Port";
2419875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2420875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    if (type.forStream()) {
2421875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        cout << "Stream";
2422875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2423875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2424875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    if (type.isFlexible()) {
2425875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        cout << "Flex";
2426875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2427875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2428875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    cout << type.paramIndex();
2429875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2430875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    switch (type.kind()) {
2431875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    case C2Param::INFO: cout << "Info"; break;
2432875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    case C2Param::SETTING: cout << "Setting"; break;
2433875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    case C2Param::TUNING: cout << "Tuning"; break;
2434875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    case C2Param::STRUCT: cout << "Struct"; break;
2435875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    default: cout << "Kind" << (int32_t)type.kind(); break;
2436875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2437875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
2438875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2439875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarvoid dumpType(C2Param::BaseIndex type) {
2440875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    using namespace std;
2441875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    cout << (type.isVendor() ? "Vendor" : "C2");
2442875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    if (type.isFlexible()) {
2443875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        cout << "Flex";
2444875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2445875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2446875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    cout << type.paramIndex() << "Struct";
2447875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
2448875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2449875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarvoid dumpType(FD::Type type) {
2450875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    using namespace std;
2451875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    switch (type) {
2452875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    case FD::BLOB: cout << "blob "; break;
2453875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    case FD::FLOAT: cout << "float "; break;
2454875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    case FD::INT32: cout << "int32_t "; break;
2455875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    case FD::INT64: cout << "int64_t "; break;
2456875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    case FD::UINT32: cout << "uint32_t "; break;
2457875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    case FD::UINT64: cout << "uint64_t "; break;
2458875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    case FD::STRING: cout << "char "; break;
2459875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    default:
2460875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        cout << "struct ";
2461875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        dumpType((C2Param::Type)type);
2462875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        break;
2463875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2464875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
2465875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2466875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarvoid dumpStruct(const C2StructDescriptor &sd) {
2467875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    using namespace std;
2468875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    cout << "struct ";
2469875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    dumpType(sd.baseIndex());
2470875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    cout << " {" << endl;
2471875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    //C2FieldDescriptor &f;
2472875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    for (const C2FieldDescriptor &f : sd) {
2473875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        PrintTo(f, &cout);
2474875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        cout << endl;
2475875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2476875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        if (f.namedValues().size()) {
2477875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            cout << ".named(";
2478875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            const char *sep = "";
2479875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            for (const FD::named_value_type &p : f.namedValues()) {
2480875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                cout << sep << p.first << "=";
2481875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                switch (f.type()) {
2482875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                case C2Value::INT32: cout << get(p.second, (int32_t *)0); break;
2483875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                case C2Value::INT64: cout << get(p.second, (int64_t *)0); break;
2484875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                case C2Value::UINT32: cout << get(p.second, (uint32_t *)0); break;
2485875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                case C2Value::UINT64: cout << get(p.second, (uint64_t *)0); break;
2486875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                case C2Value::FLOAT: cout << get(p.second, (float *)0); break;
2487875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                default: cout << "???"; break;
2488875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                }
2489875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar                sep = ",";
2490875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            }
2491875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            cout << ")";
2492875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        }
2493875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2494875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2495875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    cout << "};" << endl;
2496875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
2497875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2498875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnarvoid dumpDesc(const C2ParamDescriptor &pd) {
2499875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    using namespace std;
2500875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    if (pd.isRequired()) {
2501875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        cout << "required ";
2502875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2503875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    if (pd.isPersistent()) {
2504875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        cout << "persistent ";
2505875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2506875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    cout << "struct ";
2507875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    dumpType(pd.type());
2508875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    cout << " " << pd.name() << ";" << endl;
2509875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
2510875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2511875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarTEST_F(C2ParamTest, ReflectorTest) {
2512875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2ComponentDomainInfo domainInfo;
2513875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::shared_ptr<C2ComponentInterface> comp(new MyComponentInstance);
2514875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::vector<C2FieldSupportedValues> values;
2515875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2516875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::unique_ptr<C2StructDescriptor> desc{
2517875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        comp->getParamReflector()->describe(C2ComponentDomainInfo::indexFlags)};
2518875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    dumpStruct(*desc);
2519875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2520875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(
2521875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        C2_OK,
2522875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        comp->getSupportedValues(
2523875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            { C2ParamField(&domainInfo, &C2ComponentDomainInfo::mValue) },
2524875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar            &values)
2525875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    );
2526875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2527875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    for (const C2FieldSupportedValues &sv : values) {
2528875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar        dumpFSV(sv, &domainInfo.mValue);
2529875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    }
2530875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
2531875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2532875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarC2ENUM(Enum1, uint32_t,
2533875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    Enum1Value1,
2534875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    Enum1Value2,
2535875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    Enum1Value4 = Enum1Value2 + 2,
2536875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar);
2537875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2538875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarC2ENUM_CUSTOM_PREFIX(Enum2, uint32_t, "Enum",
2539875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    Enum2Value1,
2540875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    Enum2Value2,
2541875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    Enum2Value4 = Enum1Value2 + 2,
2542875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar);
2543875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2544875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarC2ENUM_CUSTOM_NAMES(Enum3, uint8_t,
2545875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    ({ { "value1", Enum3Value1 },
2546875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar       { "value2", Enum3Value2 },
2547875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar       { "value4", Enum3Value4 },
2548875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar       { "invalid", Invalid } }),
2549875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    Enum3Value1,
2550875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    Enum3Value2,
2551875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    Enum3Value4 = Enum3Value2 + 2,
2552875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    Invalid,
2553875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar);
2554875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2555875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarTEST_F(C2ParamTest, EnumUtilsTest) {
2556875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    std::vector<std::pair<C2String, Enum3>> pairs ( { { "value1", Enum3Value1 },
2557875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      { "value2", Enum3Value2 },
2558875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      { "value4", Enum3Value4 },
2559875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar      { "invalid", Invalid } });
2560875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    Enum3 e3;
2561875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    FD::namedValuesFor(e3);
2562875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
2563875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2564875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarTEST_F(C2ParamTest, ParamUtilsTest) {
2565875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // upper case
2566875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("yes", C2ParamUtils::camelCaseToDashed("YES"));
2567875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("no", C2ParamUtils::camelCaseToDashed("NO"));
2568875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("yes-no", C2ParamUtils::camelCaseToDashed("YES_NO"));
2569875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("yes-no", C2ParamUtils::camelCaseToDashed("YES__NO"));
2570875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("a2dp", C2ParamUtils::camelCaseToDashed("A2DP"));
2571875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("mp2-ts", C2ParamUtils::camelCaseToDashed("MP2_TS"));
2572875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("block-2d", C2ParamUtils::camelCaseToDashed("BLOCK_2D"));
2573875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("mpeg-2-ts", C2ParamUtils::camelCaseToDashed("MPEG_2_TS"));
2574875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("_hidden-value", C2ParamUtils::camelCaseToDashed("_HIDDEN_VALUE"));
2575875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("__hidden-value2", C2ParamUtils::camelCaseToDashed("__HIDDEN_VALUE2"));
2576875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("__hidden-value-2", C2ParamUtils::camelCaseToDashed("__HIDDEN_VALUE_2"));
2577875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2578875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // camel case
2579875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("yes", C2ParamUtils::camelCaseToDashed("Yes"));
2580875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("no", C2ParamUtils::camelCaseToDashed("No"));
2581875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("yes-no", C2ParamUtils::camelCaseToDashed("YesNo"));
2582875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("yes-no", C2ParamUtils::camelCaseToDashed("Yes_No"));
2583875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("mp2-ts", C2ParamUtils::camelCaseToDashed("MP2Ts"));
2584875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("block-2d", C2ParamUtils::camelCaseToDashed("Block2D"));
2585875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("mpeg-2-ts", C2ParamUtils::camelCaseToDashed("Mpeg2ts"));
2586875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("_hidden-value", C2ParamUtils::camelCaseToDashed("_HiddenValue"));
2587875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("__hidden-value-2", C2ParamUtils::camelCaseToDashed("__HiddenValue2"));
2588875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2589875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    // mixed case
2590875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("mp2t-s", C2ParamUtils::camelCaseToDashed("MP2T_s"));
2591875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("block-2d", C2ParamUtils::camelCaseToDashed("Block_2D"));
2592875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("block-2-d", C2ParamUtils::camelCaseToDashed("Block2_D"));
2593875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("mpeg-2-ts", C2ParamUtils::camelCaseToDashed("Mpeg_2ts"));
2594875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("mpeg-2-ts", C2ParamUtils::camelCaseToDashed("Mpeg_2_TS"));
2595875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("_hidden-value", C2ParamUtils::camelCaseToDashed("_Hidden__VALUE"));
2596875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("__hidden-value-2", C2ParamUtils::camelCaseToDashed("__HiddenValue_2"));
2597875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("_2", C2ParamUtils::camelCaseToDashed("_2"));
2598875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ("__23", C2ParamUtils::camelCaseToDashed("__23"));
2599875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
2600875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2601875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos MolnarTEST_F(C2ParamTest, C2ValueTest) {
2602875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    C2Value val;
2603875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int32_t i32 = -32;
2604875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    int64_t i64 = -64;
2605875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    uint32_t u32 = 32;
2606875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    uint64_t u64 = 64;
2607875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    float fp = 1.5f;
2608875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2609875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(C2Value::NO_INIT, val.type());
2610875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&i32));
2611875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(-32, i32);
2612875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&i64));
2613875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(-64, i64);
2614875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&u32));
2615875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(32u, u32);
2616875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&u64));
2617875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(64u, u64);
2618875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&fp));
2619875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(1.5f, fp);
2620875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2621875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    val = int32_t(-3216);
2622875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(C2Value::INT32, val.type());
2623875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(true, val.get(&i32));
2624875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(-3216, i32);
2625875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&i64));
2626875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(-64, i64);
2627875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&u32));
2628875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(32u, u32);
2629875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&u64));
2630875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(64u, u64);
2631875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&fp));
2632875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(1.5f, fp);
2633875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2634875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    val = uint32_t(3216);
2635875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(C2Value::UINT32, val.type());
2636875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&i32));
2637875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(-3216, i32);
2638875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&i64));
2639875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(-64, i64);
2640875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(true, val.get(&u32));
2641875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(3216u, u32);
2642875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&u64));
2643875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(64u, u64);
2644875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&fp));
2645875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(1.5f, fp);
2646875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2647875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    val = int64_t(-6432);
2648875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(C2Value::INT64, val.type());
2649875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&i32));
2650875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(-3216, i32);
2651875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(true, val.get(&i64));
2652875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(-6432, i64);
2653875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&u32));
2654875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(3216u, u32);
2655875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&u64));
2656875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(64u, u64);
2657875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&fp));
2658875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(1.5f, fp);
2659875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2660875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    val = uint64_t(6432);
2661875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(C2Value::UINT64, val.type());
2662875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&i32));
2663875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(-3216, i32);
2664875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&i64));
2665875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(-6432, i64);
2666875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&u32));
2667875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(3216u, u32);
2668875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(true, val.get(&u64));
2669875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(6432u, u64);
2670875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&fp));
2671875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(1.5f, fp);
2672875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2673875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    val = 15.25f;
2674875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(C2Value::FLOAT, val.type());
2675875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&i32));
2676875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(-3216, i32);
2677875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&i64));
2678875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(-6432, i64);
2679875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&u32));
2680875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(3216u, u32);
2681875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(false, val.get(&u64));
2682875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(6432u, u64);
2683875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(true, val.get(&fp));
2684875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar    EXPECT_EQ(15.25f, fp);
2685875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar}
2686875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar
2687875bbc8f48f10f083e3fae9b8e44d4c394e2cdf1Lajos Molnar} // namespace android
2688