Commit 3a224b6a authored by Pavel Vainerman's avatar Pavel Vainerman

(2.0): - Небольшая оптимизация по работе со строковыми параметрами. - Устранил…

(2.0): - Небольшая оптимизация по работе со строковыми параметрами. - Устранил две небольших утечки памяти (пойманных valgrind-ом)
parent 33621363
......@@ -40,14 +40,14 @@ class ObjectIndex
// info
virtual const ObjectInfo* getObjectInfo( const ObjectId )=0;
virtual const ObjectInfo* getObjectInfo( const std::string name )=0;
virtual const ObjectInfo* getObjectInfo( const std::string& name )=0;
// создание полного имени в репозитории по паре имя:узел
static std::string mkRepName( const std::string repname, const std::string nodename );
static std::string mkRepName( const std::string& repname, const std::string& nodename );
// создание имени узла по реальному и виртуальному
static std::string mkFullNodeName( const std::string realnode, const std::string virtnode );
static std::string mkFullNodeName( const std::string& realnode, const std::string& virtnode );
// получить имя для регистрации в репозитории (т.е. без секции)
static std::string getBaseName( const std::string fname );
static std::string getBaseName( const std::string& fname );
// object id
virtual ObjectId getIdByName(const std::string& name)=0;
......
......@@ -46,7 +46,7 @@ class ObjectIndex_Array:
virtual const ObjectInfo* getObjectInfo(const ObjectId);
virtual const ObjectInfo* getObjectInfo( const std::string name );
virtual const ObjectInfo* getObjectInfo( const std::string& name );
virtual ObjectId getIdByName(const std::string& name);
virtual std::string getMapName(const ObjectId id);
virtual std::string getTextName(const ObjectId id);
......
......@@ -41,23 +41,23 @@ class ObjectIndex_XML:
public ObjectIndex
{
public:
ObjectIndex_XML(const std::string xmlfile, int minSize=1000 );
ObjectIndex_XML(const std::string& xmlfile, int minSize=1000 );
ObjectIndex_XML(UniXML& xml, int minSize=1000 );
virtual ~ObjectIndex_XML();
virtual ~ObjectIndex_XML();
virtual const UniSetTypes::ObjectInfo* getObjectInfo(const ObjectId);
virtual const UniSetTypes::ObjectInfo* getObjectInfo( const std::string name );
virtual ObjectId getIdByName(const std::string& name);
virtual std::string getMapName(const ObjectId id);
virtual std::string getTextName(const ObjectId id);
virtual const UniSetTypes::ObjectInfo* getObjectInfo(const ObjectId);
virtual const UniSetTypes::ObjectInfo* getObjectInfo( const std::string& name );
virtual ObjectId getIdByName(const std::string& name);
virtual std::string getMapName(const ObjectId id);
virtual std::string getTextName(const ObjectId id);
virtual std::ostream& printMap(std::ostream& os);
virtual std::ostream& printMap(std::ostream& os);
friend std::ostream& operator<<(std::ostream& os, ObjectIndex_XML& oi );
protected:
virtual void build(UniXML& xml);
unsigned int read_section( UniXML& xml, const std::string sec, unsigned int ind );
unsigned int read_nodes( UniXML& xml, const std::string sec, unsigned int ind );
virtual void build(UniXML& xml);
unsigned int read_section( UniXML& xml, const std::string& sec, unsigned int ind );
unsigned int read_nodes( UniXML& xml, const std::string& sec, unsigned int ind );
private:
typedef std::map<std::string, ObjectId> MapObjectKey;
......
......@@ -11,12 +11,12 @@ class ObjectIndex_idXML:
public UniSetTypes::ObjectIndex
{
public:
ObjectIndex_idXML( const std::string xmlfile );
ObjectIndex_idXML( const std::string& xmlfile );
ObjectIndex_idXML(UniXML& xml);
virtual ~ObjectIndex_idXML();
virtual const UniSetTypes::ObjectInfo* getObjectInfo( const UniSetTypes::ObjectId );
virtual const UniSetTypes::ObjectInfo* getObjectInfo( const std::string name );
virtual const UniSetTypes::ObjectInfo* getObjectInfo( const std::string& name );
virtual UniSetTypes::ObjectId getIdByName( const std::string& name );
virtual std::string getMapName( const UniSetTypes::ObjectId id );
virtual std::string getTextName( const UniSetTypes::ObjectId id );
......@@ -26,8 +26,8 @@ class ObjectIndex_idXML:
protected:
virtual void build( UniXML& xml );
void read_section( UniXML& xml, const std::string sec );
void read_nodes( UniXML& xml, const std::string sec );
void read_section( UniXML& xml, const std::string& sec );
void read_nodes( UniXML& xml, const std::string& sec );
private:
typedef std::map<UniSetTypes::ObjectId, UniSetTypes::ObjectInfo> MapObjects;
......
......@@ -18,7 +18,7 @@
*/
// --------------------------------------------------------------------------
/*! \file
* \author Vitaly Lipatov
* \author Vitaly Lipatov, PavelVainerman
* \par
* \bug НЕ РАБОТАЕТ функция findNode. (не ищет по полю name, если задать)
......@@ -46,15 +46,15 @@ class UniXML_iterator:
{}
UniXML_iterator() {}
std::string getProp(const std::string name) const;
std::string getPropUtf8(const std::string name) const;
int getIntProp(const std::string name) const;
std::string getProp( const std::string& name ) const;
std::string getPropUtf8( const std::string& name ) const;
int getIntProp( const std::string& name ) const;
/// if value if not positive ( <= 0 ), returns def
int getPIntProp(const std::string name, int def) const;
void setProp(const std::string name, const std::string text);
int getPIntProp(const std::string& name, int def) const;
void setProp( const std::string& name, const std::string& text );
bool findName(const std::string node, const std::string searchname);
bool find(const std::string searchnode);
bool findName( const std::string& node, const std::string& searchname );
bool find( const std::string& searchnode);
/*! Перейти к следующему узлу. Возвращает false, если некуда перейти */
bool goNext();
......@@ -146,11 +146,11 @@ public:
}
// Загружает указанный файл
void open(const std::string filename);
void open(const std::string& filename);
void close();
inline bool isOpen(){ return doc!=0; }
UniXML(const std::string filename);
UniXML( const std::string& filename );
UniXML();
......@@ -164,20 +164,20 @@ public:
void newDoc(const std::string& root_node, std::string xml_ver="1.0");
// Получить свойство name указанного узла node
static std::string getProp(const xmlNode* node, const std::string name);
static std::string getPropUtf8(const xmlNode* node, const std::string name);
static int getIntProp(const xmlNode* node, const std::string name);
static std::string getProp(const xmlNode* node, const std::string& name);
static std::string getPropUtf8(const xmlNode* node, const std::string& name);
static int getIntProp(const xmlNode* node, const std::string& name);
/// if value if not positive ( <= 0 ), returns def
static int getPIntProp(const xmlNode* node, const std::string name, int def);
static int getPIntProp(const xmlNode* node, const std::string& name, int def);
// Установить свойство name указанного узла node
static void setProp(xmlNode* node, const std::string name, const std::string text);
static void setProp(xmlNode* node, const std::string& name, const std::string& text);
// Добавить новый дочерний узел
static xmlNode* createChild(xmlNode* node, const std::string title, const std::string text);
static xmlNode* createChild(xmlNode* node, const std::string& title, const std::string& text);
// Добавить следующий узел
static xmlNode* createNext(xmlNode* node, const std::string title, const std::string text);
static xmlNode* createNext(xmlNode* node, const std::string& title, const std::string& text);
// Удалить указанный узел и все вложенные узлы
static void removeNode(xmlNode* node);
......@@ -187,31 +187,30 @@ public:
// Сохранить в файл, если параметр не указан, сохраняет в тот файл
// который был загружен последним.
bool save(const std::string filename="", int level = 2);
bool save(const std::string& filename="", int level = 2);
// Переместить указатель к следующему узлу
static xmlNode* nextNode(xmlNode* node);
// После проверки исправить рекурсивный алгоритм на обычный,
// используя ->parent
xmlNode* findNode(xmlNode* node, const std::string searchnode, const std::string name = "") const;
xmlNode* findNodeUtf8(xmlNode* node, const std::string searchnode, const std::string name = "") const;
xmlNode* findNode(xmlNode* node, const std::string& searchnode, const std::string& name = "") const;
xmlNode* findNodeUtf8(xmlNode* node, const std::string& searchnode, const std::string& name = "") const;
xmlNode* extFindNode(xmlNode* node, int depth, int width, const std::string searchnode, const std::string name = "", bool top=true );
xmlNode* extFindNodeUtf8(xmlNode* node, int depth, int width, const std::string searchnode, const std::string name = "", bool top=true );
xmlNode* extFindNode(xmlNode* node, int depth, int width, const std::string& searchnode, const std::string& name = "", bool top=true );
xmlNode* extFindNodeUtf8(xmlNode* node, int depth, int width, const std::string& searchnode, const std::string& name = "", bool top=true );
protected:
// Преобразование текстовой строки из XML в строку нашего внутреннего представления
static std::string xml2local(const std::string text);
static std::string xml2local( const std::string& text );
// Преобразование текстовой строки из нашего внутреннего представления в строку для XML
// Возвращает указатель на временный буфер, который один на все вызовы функции.
static const xmlChar* local2xml(std::string text);
static std::string local2utf8(const std::string text);
static const xmlChar* local2xml( const std::string& text );
static std::string local2utf8( const std::string& text );
static int recur;
};
// --------------------------------------------------------------------------
#endif
......@@ -56,19 +56,19 @@ string ObjectIndex::getNameById( const ObjectId id, const ObjectId node )
return mkRepName(t,getMapName(node));
}
// -----------------------------------------------------------------------------------------
string ObjectIndex::mkRepName( const std::string repname, const std::string nodename )
string ObjectIndex::mkRepName( const std::string& repname, const std::string& nodename )
{
return repname + sepName + nodename;
}
// -----------------------------------------------------------------------------------------
string ObjectIndex::mkFullNodeName( const std::string realnode, const std::string virtnode )
string ObjectIndex::mkFullNodeName( const std::string& realnode, const std::string& virtnode )
{
// realnode справа, что поиск и вырезание происходили быстрее
// эта функция часто используется...
return virtnode + sepNode + realnode;
}
// -----------------------------------------------------------------------------------------
std::string ObjectIndex::getBaseName( const std::string fname )
std::string ObjectIndex::getBaseName( const std::string& fname )
{
string::size_type pos = fname.rfind('/');
if( pos != string::npos )
......
......@@ -117,7 +117,7 @@ const ObjectInfo* ObjectIndex_Array::getObjectInfo( const ObjectId id )
}
// -----------------------------------------------------------------------------------------
const ObjectInfo* ObjectIndex_Array::getObjectInfo( const std::string name )
const ObjectInfo* ObjectIndex_Array::getObjectInfo( const std::string& name )
{
MapObjectKey::iterator it = mok.find(name);
if( it != mok.end() )
......
......@@ -28,7 +28,7 @@
using namespace UniSetTypes;
using namespace std;
// -----------------------------------------------------------------------------------------
ObjectIndex_XML::ObjectIndex_XML( const string xmlfile, int minSize ):
ObjectIndex_XML::ObjectIndex_XML( const string& xmlfile, int minSize ):
omap(minSize)
{
UniXML xml;
......@@ -115,7 +115,7 @@ void ObjectIndex_XML::build(UniXML& xml)
// omap[ind].id = ind;
}
// ------------------------------------------------------------------------------------------
unsigned int ObjectIndex_XML::read_section( UniXML& xml, const std::string sec, unsigned int ind )
unsigned int ObjectIndex_XML::read_section( UniXML& xml, const std::string& sec, unsigned int ind )
{
if( (unsigned)ind >= omap.size() )
{
......@@ -214,7 +214,7 @@ unsigned int ObjectIndex_XML::read_section( UniXML& xml, const std::string sec,
return ind;
}
// ------------------------------------------------------------------------------------------
unsigned int ObjectIndex_XML::read_nodes( UniXML& xml, const std::string sec, unsigned int ind )
unsigned int ObjectIndex_XML::read_nodes( UniXML& xml, const std::string& sec, unsigned int ind )
{
if( ind >= omap.size() )
{
......@@ -293,7 +293,7 @@ const ObjectInfo* ObjectIndex_XML::getObjectInfo( const ObjectId id )
return NULL;
}
// ------------------------------------------------------------------------------------------
const ObjectInfo* ObjectIndex_XML::getObjectInfo( const std::string name )
const ObjectInfo* ObjectIndex_XML::getObjectInfo( const std::string& name )
{
MapObjectKey::iterator it = mok.find(name);
if( it != mok.end() )
......
......@@ -8,7 +8,7 @@
using namespace UniSetTypes;
using namespace std;
// -----------------------------------------------------------------------------------------
ObjectIndex_idXML::ObjectIndex_idXML( const string xmlfile )
ObjectIndex_idXML::ObjectIndex_idXML( const string& xmlfile )
{
UniXML xml;
// try
......@@ -86,7 +86,7 @@ void ObjectIndex_idXML::build(UniXML& xml)
read_nodes(xml,"nodes");
}
// ------------------------------------------------------------------------------------------
void ObjectIndex_idXML::read_section( UniXML& xml, const std::string sec )
void ObjectIndex_idXML::read_section( UniXML& xml, const std::string& sec )
{
string secRoot = xml.getProp( xml.findNode(xml.getFirstNode(),"RootSection"), "name");
if( secRoot.empty() )
......@@ -162,7 +162,7 @@ void ObjectIndex_idXML::read_section( UniXML& xml, const std::string sec )
}
}
// ------------------------------------------------------------------------------------------
void ObjectIndex_idXML::read_nodes( UniXML& xml, const std::string sec )
void ObjectIndex_idXML::read_nodes( UniXML& xml, const std::string& sec )
{
xmlNode* root( xml.findNode(xml.getFirstNode(),sec) );
if( !root )
......@@ -231,7 +231,7 @@ const ObjectInfo* ObjectIndex_idXML::getObjectInfo( const ObjectId id )
return NULL;
}
// ------------------------------------------------------------------------------------------
const ObjectInfo* ObjectIndex_idXML::getObjectInfo( const std::string name )
const ObjectInfo* ObjectIndex_idXML::getObjectInfo( const std::string& name )
{
const char* n = name.c_str();
for( MapObjects::iterator it=omap.begin(); it!=omap.end(); it++ )
......
......@@ -293,7 +293,7 @@ void Configuration::initConfiguration( int argc, const char* const* argv )
param << this << name;
name = param.str();
param << "=corbaname::" << it->host << ":" << it->port;
new_argv[i+1] = strdup(param.str().c_str());
new_argv[i+1] = param.str().c_str(); // strdup(param.str().c_str());
if( ulog.is_info() )
ulog.info() << "(Configuration): внесли параметр " << param.str() << endl;
......
......@@ -46,7 +46,7 @@ using namespace std;
// Временная переменная для подсчёта рекурсии
int UniXML::recur=0;
UniXML::UniXML(const string filename):
UniXML::UniXML(const string& filename):
doc(0),
filename(filename)
{
......@@ -80,7 +80,7 @@ void UniXML::newDoc(const string& root_node, string xml_ver)
cur = getFirstNode();
}
void UniXML::open(const string _filename)
void UniXML::open(const string& _filename)
{
// if(doc)
// close();
......@@ -112,45 +112,47 @@ void UniXML::close()
}
/* FIXME: compatibility, remove later */
string UniXML::getPropUtf8(const xmlNode* node, const string name)
string UniXML::getPropUtf8(const xmlNode* node, const string& name)
{
return getProp(node, name);
}
string UniXML::getProp(const xmlNode* node, const string name)
string UniXML::getProp(const xmlNode* node, const string& name)
{
const char * text = (const char*)::xmlGetProp((xmlNode*)node, (const xmlChar*)name.c_str());
if( !text )
if( text == NULL )
return "";
return string(text);
string t(text);
xmlFree( (void*)text );
return t;
}
int UniXML::getIntProp(const xmlNode* node, const string name )
int UniXML::getIntProp(const xmlNode* node, const string& name )
{
return UniSetTypes::uni_atoi(getProp(node, name));
}
int UniXML::getPIntProp(const xmlNode* node, const string name, int def )
int UniXML::getPIntProp(const xmlNode* node, const string& name, int def )
{
string param = getProp(node,name);
if( param.empty() )
return def;
return UniSetTypes::uni_atoi(param);
}
void UniXML::setProp(xmlNode* node, string name, string text)
void UniXML::setProp(xmlNode* node, const string& name, const string& text )
{
::xmlSetProp(node, (const xmlChar*)name.c_str(), (const xmlChar*)text.c_str());
}
xmlNode* UniXML::createChild(xmlNode* node, string title, string text)
xmlNode* UniXML::createChild(xmlNode* node, const string& title, const string& text)
{
return ::xmlNewChild(node, NULL, (const xmlChar*)title.c_str(), (const xmlChar*)text.c_str());
}
xmlNode* UniXML::createNext(xmlNode* node, const string title, const string text)
xmlNode* UniXML::createNext(xmlNode* node, const string& title, const string& text)
{
if( node->parent )
return createChild(node->parent, title,text);
......@@ -195,7 +197,7 @@ xmlNode* UniXML::copyNode(xmlNode* node, int recursive)
}
bool UniXML::save(const string filename, int level)
bool UniXML::save(const string& filename, int level)
{
string fn(filename);
if (fn.empty())
......@@ -229,7 +231,7 @@ xmlNode* UniXML::nextNode(xmlNode* n)
return n;
}
xmlNode* UniXML::findNode(xmlNode* node, const string searchnode, const string name ) const
xmlNode* UniXML::findNode(xmlNode* node, const string& searchnode, const string& name ) const
{
while (node != NULL)
{
......@@ -251,7 +253,7 @@ xmlNode* UniXML::findNode(xmlNode* node, const string searchnode, const string n
return NULL;
}
xmlNode* UniXML::findNodeUtf8(xmlNode* node, const string searchnode, const string name ) const
xmlNode* UniXML::findNodeUtf8(xmlNode* node, const string& searchnode, const string& name ) const
{
return findNode(node, searchnode, name);
}
......@@ -263,7 +265,7 @@ xmlNode* UniXML::findNodeUtf8(xmlNode* node, const string searchnode, const stri
//width means number of nodes of the same level as node in 1-st parameter (width number includes first node)
//depth means number of times we can go to the children, if 0 we can't go only to elements of the same level
xmlNode* UniXML::extFindNode(xmlNode* node, int depth, int width, const string searchnode, const string name, bool top )
xmlNode* UniXML::extFindNode(xmlNode* node, int depth, int width, const string& searchnode, const string& name, bool top )
{
int i=0;
while (node != NULL)
......@@ -289,7 +291,7 @@ xmlNode* UniXML::extFindNode(xmlNode* node, int depth, int width, const string s
return NULL;
}
xmlNode* UniXML::extFindNodeUtf8(xmlNode* node, int depth, int width, const string searchnode, const string name, bool top )
xmlNode* UniXML::extFindNodeUtf8(xmlNode* node, int depth, int width, const string& searchnode, const string& name, bool top )
{
return extFindNode(node, depth, width, searchnode, name, top );
}
......@@ -380,7 +382,7 @@ bool UniXML_iterator::goChildren()
}
// -------------------------------------------------------------------------
string UniXML_iterator::getProp( const string name ) const
string UniXML_iterator::getProp( const string& name ) const
{
return UniXML::getProp(curNode, name);
}
......@@ -394,18 +396,18 @@ const string UniXML_iterator::getContent() const
}
// -------------------------------------------------------------------------
string UniXML_iterator::getPropUtf8( const string name ) const
string UniXML_iterator::getPropUtf8( const string& name ) const
{
return UniXML::getProp(curNode, name);
}
// -------------------------------------------------------------------------
int UniXML_iterator::getIntProp( const string name ) const
int UniXML_iterator::getIntProp( const string& name ) const
{
return UniSetTypes::uni_atoi(UniXML::getProp(curNode, name));
}
int UniXML_iterator::getPIntProp( const string name, int def ) const
int UniXML_iterator::getPIntProp( const string& name, int def ) const
{
int i = getIntProp(name);
if (i <= 0)
......@@ -414,13 +416,13 @@ int UniXML_iterator::getPIntProp( const string name, int def ) const
}
// -------------------------------------------------------------------------
void UniXML_iterator::setProp( const string name, const string text )
void UniXML_iterator::setProp( const string& name, const string& text )
{
UniXML::setProp(curNode, name, text);
}
// -------------------------------------------------------------------------
bool UniXML_iterator::findName( const std::string node, const std::string searchname )
bool UniXML_iterator::findName( const std::string& node, const std::string& searchname )
{
while( this->find(node) )
{
......@@ -433,12 +435,12 @@ bool UniXML_iterator::findName( const std::string node, const std::string search
}
// -------------------------------------------------------------------------
bool UniXML_iterator::find( const std::string searchnode )
bool UniXML_iterator::find( const std::string& searchnode )
{
// Функция ищет "в ширину и в глубь"
xmlNode* rnode = curNode;
while (curNode != NULL)
{
while( curNode->children )
......@@ -450,14 +452,14 @@ bool UniXML_iterator::find( const std::string searchnode )
}
while( !curNode->next && curNode->parent )
{
{
// выше исходного узла "подыматься" нельзя
if( curNode == rnode )
break;
break;
curNode = curNode->parent;
}
curNode = curNode->next;
if ( curNode && searchnode == (const char*)curNode->name )
......
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