FireBreath学习之四 FB::Variant类 FB::VariantList类 和一些建议

FB::Variant类



支持的类型:

long: 没有int类型,因为IE发送long类型,允许使用int类型,但是会造成数据丢失并且没有警告。

double: 任何来自浏览器的浮点数都会作为double类型返回

bool: javascript中的boolean值被转换为C++中的bool

std::string: 无UNICODE

std::wstring: UNICODE支持

FB::JSObjectPtr: 任何来自js的对象或方法都可以被转换为一个FB::JSObject,实际是通过boost::shared_ptr<JSObject>

FB::JSAPIPtr:  通常是你在C++中创建的FB::JSAPI指针,JSAPI就是个例子。 不会来自浏览器,只会传给浏览器。

std::vector<type>: 任何js数组对象都可以转换成一个vector如果type被支持。

std::map<std::string, type>:任何js对象都可以被转换成一个以string类型为索引的map,前提如果type被支持。

FB::VariantList:  typedef for std::vector<FB::variant>

FB::VariantMap:   typedef for  std::map<std::string, std::variant>


FB::CatchAll:  通常是JSAPIAuto类中方法的最后一个参数,这样就能catch0个或多个参数,即除了前面参数剩下的参数。

CatchAll基本上是std::vector<FB::variant>的一个实际应用。


//使用CatchAll来取得参数

//某函数

void Func(long a, double b,  FB:CatchAll& args)

{

//codes

}


//..


const FB::VariantList& values = args.value;   //取得除了a,b以外的所有参数


std::string str = values[0].convert_case<std::string>();  //取CatchAl中第一个参数

//.. 下同



/


bool is_of_type() const


eg.

std::string str = "foo";

FB::variant var(str);

assert(var.is_of_type<std::string>());


//\


const std::type_info& get_type() const

返回数据的类型信息


eg.

std::string str = "foo";

FB::variant var(str);

assert(var.get_type() == typeid(std::string));


//


const T& convert_cast() const


继承自cast(),转换为容器类型

成功返回数据的常引用

失败扔出FB::bad_variant_cast


///


const T& cast()


成功返回数据的常引用

失败扔出FB::bad_variant_cast


/


bool empty() const


如果变量没有任何数据则返回true,否则返回false


///


void reset()


如果为空empty()为真,则无操作

如果不为空,数据释放

操作后,empty()为真



eg.


FB::variant var(12);


try

{

long a = var.convert_cast<long>();

std::string str = var.convert_cast<std::string>();

}

catch (FB::bad_variant_cast& e)

{

std::cerr << "转换异常:" << e.what();

}


std::string str2("hi");

FB::variant var2(str2);

assert(var2.get_type() == typeid(std::string));


//....



/

/

/

/

/

/

/


FB::VariantList类



这个类是FB:variant的容器,太支持使用索引随机访问。


/


variant_list_of()


头文件: variant_list.h


//----------------------------

相关类型:

FB::detail::VariantListInserter

包括一个新的FB::VariantList

支持通过括号"()"运算符来插入

可以通过操作符FB::VariantList&()来转换成FB::VariantList


eg.

FB::VariantList vars = FB::variant_list_of(1)("2")(3.4);


FireEvent(""eventName", FB::variant_list_of(5));


/


make_variant_list()


头文件:variant_list.h


make_variant_list()允许你从STL类型容器创建新的{FB::VariantList}s


int vals[] = {1,2,3,4,5};

std::vector<int> valVec(vals, vals+5);

 

FB::VariantList vars = FB::make_variant_list(valVec);

// vars contains 1,2,3,4,5 now

 

FB::VariantList vars2 = FB::make_variant_list(valVec.begin(), valVec.end()-1);

// vars2 now contains 1,2,3,4

 

FB::VariantList vars3(valVec.size());

FB::make_variant_list(valVec.begin(), valVec.end()-2, vars3.begin());

// vars3 now contains 1,2,3


/


convert_variant_list()


头文件: "variant_list.h"


该函数允许你把一个FB::VariantList转换成一个STL容器


eg.


typedef std::vector<std::string> StringVec;

FB::VariantList vars = FB::variant_list_of(1)("2")(3.0);

 

StringVec strings1 = FB::convert_variant_list<StringVec>(vars);

StringVec strings2 = FB::convert_variant_list<StringVec>(vars.begin(), vars.end()-1);

 

StringVec strings3(vars.size());

FB::convert_variant_list(vars, strings3);

 

StringVec strings4(vars.size()-1);

FB::convert_variant_list<std::string>(vars.begin(), vars.end()-1, strings4.begin());





/

/

/

/

/

/

/


一些建议


当要返回大量的或者数据较大的FB::variant或FB::VariantMap对象给javascript时, 可能会在传数据给浏览器时有个数据转换造成的停顿。 尽管你可以在你的插件的函数执行到底的时候检测来避免这种情况,但是js调用插件函数仍然会在较长一段时间(微观)后才能返回。

有一种替代方案来加速这个过程,那就是把返回结果对象的解析留给浏览器的JSON解析器来做。下面的例子来演示怎么完成。

#include "DOM/Window.h"

#include "json/json.h"

#include "fbjson.h" 

 

 

FB::variant yourPluginAPI::aMethodThatReturnsParsedVariants()

{

 

  // 在这里创建一个VariantMap对象    

FB:VariantMap myMap;

 //   ...

 

    // 获得DOM window对象引用

    FB::DOM::WindowPtr window = m_host->getDOMWindow();

 

    // 检查浏览器是否有内置的JSON解析器

    if (window && window->getJSObject()->HasProperty("JSON")) 

{

        //把VariantMap转换成一个 Json::Value对象

        Json::Value json_map = FB::variantToJsonValue(myMap);

 

        //创建一个writer,把对象转换成字符串string

        Json::FastWriter writer;

 

        //创建一个浏览器的JSON实体的引用

        FB::JSObjectPtr obj = window->getProperty<FB::JSObjectPtr>("JSON");

 

        //返回调用parse函数的结果

        return obj->Invoke("parse", FB::variant_list_of(writer.write(json_map)));

    } 

else 

//没有检测到JSON解析器,返回一个FB::variant对象

        return myMap;

    }

}

 

//...


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值