Kaydet (Commit) f692c61a authored tarafından Michael Meeks's avatar Michael Meeks

configmgr: avoid constructing duplicating and freeing Any's

Accelerates headless startup by 6.5m cycles or so, 0.6% or
so but something.

Change-Id: I9edca3d0c1c81d865e8369fee5cf193da7adb97c
üst 115fd951
...@@ -33,6 +33,10 @@ LocalizedValueNode::LocalizedValueNode(int layer, css::uno::Any const & value): ...@@ -33,6 +33,10 @@ LocalizedValueNode::LocalizedValueNode(int layer, css::uno::Any const & value):
Node(layer), value_(value) Node(layer), value_(value)
{} {}
LocalizedValueNode::LocalizedValueNode(int layer):
Node(layer)
{}
rtl::Reference< Node > LocalizedValueNode::clone(bool) const { rtl::Reference< Node > LocalizedValueNode::clone(bool) const {
return new LocalizedValueNode(*this); return new LocalizedValueNode(*this);
} }
...@@ -42,9 +46,11 @@ OUString LocalizedValueNode::getTemplateName() const { ...@@ -42,9 +46,11 @@ OUString LocalizedValueNode::getTemplateName() const {
} }
void LocalizedValueNode::setValue(int layer, css::uno::Any const & value) { void LocalizedValueNode::setValue(int layer, css::uno::Any const & value)
{
setLayer(layer); setLayer(layer);
value_ = value; if (&value != &value_)
value_ = value;
} }
LocalizedValueNode::LocalizedValueNode(LocalizedValueNode const & other): LocalizedValueNode::LocalizedValueNode(LocalizedValueNode const & other):
......
...@@ -32,13 +32,19 @@ namespace configmgr { ...@@ -32,13 +32,19 @@ namespace configmgr {
class LocalizedValueNode: public Node { class LocalizedValueNode: public Node {
public: public:
LocalizedValueNode(int layer);
LocalizedValueNode(int layer, com::sun::star::uno::Any const & value); LocalizedValueNode(int layer, com::sun::star::uno::Any const & value);
virtual rtl::Reference< Node > clone(bool keepTemplateName) const SAL_OVERRIDE; virtual rtl::Reference< Node > clone(bool keepTemplateName) const SAL_OVERRIDE;
virtual OUString getTemplateName() const SAL_OVERRIDE; virtual OUString getTemplateName() const SAL_OVERRIDE;
com::sun::star::uno::Any getValue() const { return value_;} com::sun::star::uno::Any getValue() const { return value_;}
com::sun::star::uno::Any *getValuePtr(int layer)
{
setLayer(layer);
return &value_;
}
void setValue(int layer, com::sun::star::uno::Any const & value); void setValue(int layer, com::sun::star::uno::Any const & value);
......
...@@ -69,6 +69,13 @@ void PropertyNode::setValue(int layer, css::uno::Any const & value) { ...@@ -69,6 +69,13 @@ void PropertyNode::setValue(int layer, css::uno::Any const & value) {
externalDescriptor_ = ""; externalDescriptor_ = "";
} }
com::sun::star::uno::Any *PropertyNode::getValuePtr(int layer)
{
setLayer(layer);
externalDescriptor_ = "";
return &value_;
}
void PropertyNode::setExternal(int layer, OUString const & descriptor) { void PropertyNode::setExternal(int layer, OUString const & descriptor) {
assert(!descriptor.isEmpty()); assert(!descriptor.isEmpty());
setLayer(layer); setLayer(layer);
......
...@@ -48,6 +48,7 @@ public: ...@@ -48,6 +48,7 @@ public:
com::sun::star::uno::Any getValue(Components & components); com::sun::star::uno::Any getValue(Components & components);
void setValue(int layer, com::sun::star::uno::Any const & value); void setValue(int layer, com::sun::star::uno::Any const & value);
com::sun::star::uno::Any *getValuePtr(int layer);
void setExternal(int layer, OUString const & descriptor); void setExternal(int layer, OUString const & descriptor);
......
...@@ -345,32 +345,57 @@ bool ValueParser::endElement() { ...@@ -345,32 +345,57 @@ bool ValueParser::endElement() {
switch (state_) { switch (state_) {
case STATE_TEXT: case STATE_TEXT:
{ {
css::uno::Any value; css::uno::Any *pValue = NULL;
switch (node_->kind()) {
case Node::KIND_PROPERTY:
pValue = static_cast< PropertyNode * >(node_.get())->getValuePtr(layer_);
break;
case Node::KIND_LOCALIZED_PROPERTY:
{
NodeMap & members = node_->getMembers();
NodeMap::iterator i(members.find(localizedName_));
LocalizedValueNode *pLVNode;
if (i == members.end()) {
pLVNode = new LocalizedValueNode(layer_);
members.insert(
NodeMap::value_type(localizedName_, pLVNode));
} else {
pLVNode = static_cast< LocalizedValueNode * >(i->second.get());
}
pValue = pLVNode->getValuePtr(layer_);
}
break;
default:
assert(false); // this cannot happen
return false;
}
if (items_.empty()) { if (items_.empty()) {
value = parseValue(separator_, pad_.get(), type_); *pValue = parseValue(separator_, pad_.get(), type_);
pad_.clear(); pad_.clear();
} else { } else {
switch (type_) { switch (type_) {
case TYPE_BOOLEAN_LIST: case TYPE_BOOLEAN_LIST:
value = convertItems< sal_Bool >(); *pValue = convertItems< sal_Bool >();
break; break;
case TYPE_SHORT_LIST: case TYPE_SHORT_LIST:
value = convertItems< sal_Int16 >(); *pValue = convertItems< sal_Int16 >();
break; break;
case TYPE_INT_LIST: case TYPE_INT_LIST:
value = convertItems< sal_Int32 >(); *pValue = convertItems< sal_Int32 >();
break; break;
case TYPE_LONG_LIST: case TYPE_LONG_LIST:
value = convertItems< sal_Int64 >(); *pValue = convertItems< sal_Int64 >();
break; break;
case TYPE_DOUBLE_LIST: case TYPE_DOUBLE_LIST:
value = convertItems< double >(); *pValue = convertItems< double >();
break; break;
case TYPE_STRING_LIST: case TYPE_STRING_LIST:
value = convertItems< OUString >(); *pValue = convertItems< OUString >();
break; break;
case TYPE_HEXBINARY_LIST: case TYPE_HEXBINARY_LIST:
value = convertItems< css::uno::Sequence< sal_Int8 > >(); *pValue = convertItems< css::uno::Sequence< sal_Int8 > >();
break; break;
default: default:
assert(false); // this cannot happen assert(false); // this cannot happen
...@@ -378,30 +403,6 @@ bool ValueParser::endElement() { ...@@ -378,30 +403,6 @@ bool ValueParser::endElement() {
} }
items_.clear(); items_.clear();
} }
switch (node_->kind()) {
case Node::KIND_PROPERTY:
static_cast< PropertyNode * >(node_.get())->setValue(
layer_, value);
break;
case Node::KIND_LOCALIZED_PROPERTY:
{
NodeMap & members = node_->getMembers();
NodeMap::iterator i(members.find(localizedName_));
if (i == members.end()) {
members.insert(
NodeMap::value_type(
localizedName_,
new LocalizedValueNode(layer_, value)));
} else {
static_cast< LocalizedValueNode * >(i->second.get())->
setValue(layer_, value);
}
}
break;
default:
assert(false); // this cannot happen
break;
}
separator_ = OString(); separator_ = OString();
node_.clear(); node_.clear();
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment