#pragma once

#include "CookConfig.h"
#include <string>
#include <vector>

U_NS_BEGIN_CATERING

class CCookVariant
{
public:
    enum EType  // 数据类型
    {
        TYPE_INVALID = 0,   /**< 无效类型 */
        TYPE_INT,           /**< 整形类型 */
        TYPE_DOUBLE,        /**< 浮点数类型 */
        TYPE_BYTE_ARRAY     /**< 字节流类型 */
    };
    CCookVariant();
    explicit CCookVariant(int iVal);
    explicit CCookVariant(double fVal);
    // bNotEndWithZero表示字节流是否以非\0结尾
    explicit CCookVariant(const std::vector<unsigned char>& byteArray, bool bNotEndWithZero = true);
    ~CCookVariant();

    // 获取类型
    EType Type() const;
    // 设置整形值
    bool SetValue(int iVal);
    // 设置浮点数值
    bool SetValue(double fVal);
    // 设置字节流值，bNotEndWithZero表示字节流是否以非\0结尾
    bool SetValue(const std::vector<unsigned char>& byteArray, bool bNotEndWithZero = true);
    // 获取对应的整形值
    int ToInt(bool* pOk = NULL) const;
    // 获取对应的浮点型值
    double ToDouble(bool* pOk = NULL) const;
    // 获取对应的字节流值
    std::vector<unsigned char> ToByteArray(bool* pOk = NULL) const;
    // 设置对应的字节流，bBase64表示字节流是否为base64编码的，仅虚拟机内部使用
    bool SetValue(const unsigned char* pData, int iLen, bool bBase64);
    // 获取对应的字节流，仅虚拟机内部使用
    const unsigned char* ToByteArrayEx(int* pSize)const;
    // 转字符串，仅虚拟机内部使用
    const std::string ToString()const;
    // 判断是否相等，仅虚拟机内部使用
    bool Equal(const CCookVariant& other)const;
private:
    // 清理
    void Cleanup();
    // 允许拷贝
    //U_DISABLE_COPY(CCookVariant)
    
private:
    EType m_eType;
    int m_iVal;
    double m_dVal;
    std::vector<unsigned char> m_byteArray;
};

U_NS_END_CATERING


