Android CCodec Codec2 (五)C2Param - Ⅲ

这一节我们来看看简单参数的定义方式

1、C2SimpleValueStruct

Codec2框架提供了模板类C2SimpleValueStruct来帮助我们定义非灵活数组的简单参数。C2SimpleValueStruct的定义如下:

cpp 复制代码
template<typename T>
struct C2SimpleValueStruct {
    T value; ///< simple value of the structure
    // Default constructor.
    inline C2SimpleValueStruct() = default;
    // Constructor with an initial value.
    inline C2SimpleValueStruct(T value) : value(value) {}
    DEFINE_BASE_C2STRUCT(SimpleValue)
};

宏展开后还是很简单:

cpp 复制代码
template<typename T>
struct C2SimpleValueStruct {
    T value; ///< simple value of the structure
    // Default constructor.
    inline C2SimpleValueStruct() = default;
    // Constructor with an initial value.
    inline C2SimpleValueStruct(T value) : value(value) {}

private: 
    const static std::vector<C2FieldDescriptor> _FIELD_LIST __unused; 
public: 
    typedef C2SimpleValueStruct _type; 
    static const std::vector<C2FieldDescriptor> FieldList();
};

与复杂参数不一样的是,C2SimpleValueStruct是没有CORE_INDEX(BaseIndex)的。由于只有一个参数value,FieldList返回的C2FieldDescriptor列表只有一个元素。

cpp 复制代码
template<typename T>
const std::vector<C2FieldDescriptor> C2SimpleValueStruct<T>::FieldList() {
    return { DESCRIBE_C2FIELD(value, "value") };
}

框架帮我们预定义了一些常用的简单参数,其中混入了两个异类C2BlobValue和C2StringValue,它们是什么?

cpp 复制代码
typedef C2SimpleValueStruct<int32_t> C2Int32Value;
typedef C2SimpleValueStruct<uint32_t> C2Uint32Value;
typedef C2SimpleValueStruct<int64_t> C2Int64Value;
typedef C2SimpleValueStruct<uint64_t> C2Uint64Value;
typedef C2SimpleValueStruct<float> C2FloatValue;
typedef C2SimpleValueStruct<uint8_t[]> C2BlobValue;
typedef C2SimpleValueStruct<char[]> C2StringValue;

C2SimpleValueStruct还提供了一个模板特化,传入的模板参数为数组时会使用此特化模板:

cpp 复制代码
template<typename T>
struct C2SimpleValueStruct<T[]> {
    static_assert(std::is_same<T, char>::value || std::is_same<T, uint8_t>::value,
                  "C2SimpleValueStruct<T[]> is only for BLOB or STRING");
    T value[];

    inline C2SimpleValueStruct() = default;
    DEFINE_BASE_C2STRUCT(SimpleValue)
    FLEX(C2SimpleValueStruct, value)

private:
    inline C2SimpleValueStruct(size_t flexCount, const C2MemoryBlock<T> &block) {
        _C2ValueArrayHelper::init(value, flexCount, block);
    }

    inline C2SimpleValueStruct(size_t flexCount, const std::initializer_list<T> &init) {
        _C2ValueArrayHelper::init(value, flexCount, init);
    }

    inline C2SimpleValueStruct(size_t flexCount, const std::vector<T> &init) {
        _C2ValueArrayHelper::init(value, flexCount, init);
    }

    template<unsigned N>
    inline C2SimpleValueStruct(size_t flexCount, const T(&init)[N]) {
        _C2ValueArrayHelper::init(value, flexCount, init);
    }
};

是不是所有类型的数组都能用此特化模板呢?答案是否定的,模板中有个静态断言来检查传入的模板类型是否是char或者uint8_t,如果不是将抛出error。也就是说这个模板特化是专为char数组和uint8_t数组定义的。

将模板中宏展开:

cpp 复制代码
template<typename T>
struct C2SimpleValueStruct<T[]> {
    static_assert(std::is_same<T, char>::value || std::is_same<T, uint8_t>::value,
                  "C2SimpleValueStruct<T[]> is only for BLOB or STRING");
    T value[];

    inline C2SimpleValueStruct() = default;

private:
    const static std::vector<C2FieldDescriptor> _FIELD_LIST __unused;

public:
    typedef C2SimpleValueStruct _type;
    static const std::vector<C2FieldDescriptor> FieldList(); 

    C2_DO_NOT_COPY(C2SimpleValueStruct)
private:
    C2PARAM_MAKE_FRIENDS

    template<typename, typename> friend struct _C2FlexHelper;
public:
    typedef decltype(value) _FlexMemberType;

    inline C2SimpleValueStruct(size_t) : C2SimpleValueStruct() {}

    typedef typename _C2FlexHelper<_FlexMemberType>::FlexType FlexType;
    static_assert(
            !std::is_void<FlexType>::value,
            "member is not flexible, or a flexible array of a flexible type");
    enum : uint32_t { FLEX_SIZE = _C2FlexHelper<_FlexMemberType>::FLEX_SIZE };

private:
    inline C2SimpleValueStruct(size_t flexCount, const C2MemoryBlock<T> &block) {
        _C2ValueArrayHelper::init(value, flexCount, block);
    }

    inline C2SimpleValueStruct(size_t flexCount, const std::initializer_list<T> &init) {
        _C2ValueArrayHelper::init(value, flexCount, init);
    }

    inline C2SimpleValueStruct(size_t flexCount, const std::vector<T> &init) {
        _C2ValueArrayHelper::init(value, flexCount, init);
    }

    template<unsigned N>
    inline C2SimpleValueStruct(size_t flexCount, const T(&init)[N]) {
        _C2ValueArrayHelper::init(value, flexCount, init);
    }
};

FieldList不是由宏提供的,代码实现位于C2ParamDef.h最后:

cpp 复制代码
template<typename T>
const std::vector<C2FieldDescriptor> C2SimpleValueStruct<T[]>::FieldList() {
    return { DESCRIBE_C2FIELD(value, "value") };
}

2、C2ENUM

3、C2SimpleArrayStruct

相关推荐
三雒10 分钟前
ART堆内存系列二:从堆中排除大对象
android·性能优化
Android-Flutter36 分钟前
kotlin - 平板分屏,左右拖动,2个Activity计算宽度,使用ActivityOptions、Rect(三)
android·kotlin
zfxwasaboy1 小时前
linux Kbuild详解关于fixdep、Q、quiet、escsq
android·linux·ubuntu
Mr YiRan1 小时前
Android模拟简单的网络请求框架Retrofit实现
android·retrofit
zh_xuan6 小时前
Android Looper源码阅读
android
音视频牛哥14 小时前
打造一款高稳定、低延迟、跨平台RTSP播放器的技术实践
音视频·rtsp播放器·rtsp player·rtsp播放器录像·rtsp h.265·rtsp hevc·rtsp播放器h.265
水印云14 小时前
2025精选5款AI视频转文字工具,高效转录秒变文字!
人工智能·音视频
菊风 Juphoon15 小时前
13问详解VoLTE视频客服:菊风带你从基础到应用,厘清所有疑惑
音视频
用户02738518402616 小时前
[Android]RecycleView的item用法
android
前行的小黑炭17 小时前
Android :为APK注入“脂肪”,论Android垃圾代码在安全加固中的作用
android·kotlin