You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
117 lines
3.0 KiB
117 lines
3.0 KiB
//
|
|
// C++ Interface: tstring
|
|
//
|
|
// Description:
|
|
//
|
|
// Copyright: See COPYING file that comes with this distribution
|
|
//
|
|
//
|
|
|
|
#ifndef __TAGSTRING__H
|
|
#define __TAGSTRING__H
|
|
|
|
#include <tqstring.h>
|
|
#include <tqvaluelist.h>
|
|
#include <utility>
|
|
#include <cassert>
|
|
|
|
using namespace std;
|
|
|
|
template <class T>
|
|
class TagString_t
|
|
{
|
|
TQString str;
|
|
typedef TQValueList<std::pair<uint,T> > taglist; // may change
|
|
taglist tags;
|
|
public:
|
|
TagString_t(const TQString& s) : str(s) {}
|
|
TagString_t() {}
|
|
bool isSimple() const { return tags.empty(); }
|
|
const TQString& string() const { return str; }
|
|
unsigned length() const { return str.length(); }
|
|
TagString_t mid(unsigned idx,unsigned len=~0) const;
|
|
TagString_t left(unsigned) const;
|
|
TagString_t right(unsigned) const;
|
|
void insert(uint,const TQString& s);
|
|
int find ( TQChar c, int index = 0, bool cs = TRUE ) const {
|
|
return str.find(c,index,cs);
|
|
}
|
|
TagString_t& operator+=(const TagString_t& s);
|
|
typename taglist::const_iterator tagsBegin() const { return tags.begin(); }
|
|
typename taglist::const_iterator tagsEnd() const { return tags.end(); }
|
|
typename taglist::iterator tagsBegin() { return tags.begin(); }
|
|
typename taglist::iterator tagsEnd() { return tags.end(); }
|
|
void insertTag(uint pos,const T& t);
|
|
void eraseTag(const typename taglist::iterator& which) { tags.erase(which); }
|
|
/* void insert(uint idx,const TQString&);
|
|
void insert(uint idx,const char*);
|
|
void addTag(uint);
|
|
void remove(uint start,uint len);*/
|
|
};
|
|
|
|
template <class T>
|
|
TagString_t<T> TagString_t<T>::mid(unsigned idx,unsigned len) const
|
|
{
|
|
TagString_t ret(str.mid(idx,len));
|
|
unsigned max=idx+len;
|
|
if(max<idx) max=~0;
|
|
for(typename taglist::const_iterator it=tags.begin(),end=tags.end();it!=end;++it) {
|
|
if((*it).first>=idx && (*it).first<max)
|
|
ret.tags.push_back(*it);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
template <class T>
|
|
TagString_t<T> TagString_t<T>::left(unsigned len) const
|
|
{
|
|
TagString_t ret(str.left(len));
|
|
for(typename taglist::const_iterator it=tags.begin(),end=tags.end();it!=end;++it) {
|
|
if((*it).first<len)
|
|
ret.tags.push_back(*it);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
template <class T>
|
|
TagString_t<T> TagString_t<T>::right(unsigned len) const
|
|
{
|
|
TagString_t ret(str.right(len));
|
|
for(typename taglist::const_iterator it=tags.begin(),end=tags.end();it!=end;++it) {
|
|
if((*it).first>=str.length()-len)
|
|
ret.tags.push_back(*it);
|
|
}
|
|
return ret;
|
|
}
|
|
|
|
template <class T>
|
|
void TagString_t<T>::insert(uint idx,const TQString& s)
|
|
{
|
|
str.insert(idx,s);
|
|
const unsigned disp=s.length();
|
|
for(typename taglist::iterator it=tags.begin(),end=tags.end();it!=end;++it) {
|
|
if((*it).first>=idx)
|
|
(*it).first+=disp;
|
|
}
|
|
}
|
|
|
|
template <class T>
|
|
TagString_t<T>& TagString_t<T>::operator+=(const TagString_t& s)
|
|
{
|
|
str+=s.str;
|
|
const unsigned disp=length();
|
|
for(typename taglist::const_iterator it=s.tags.begin(),end=s.tags.end();it!=end;++it) {
|
|
tags.push_back(make_pair((*it).first+disp,(*it).second));
|
|
}
|
|
return *this;
|
|
}
|
|
|
|
template <class T>
|
|
void TagString_t<T>::insertTag(uint pos,const T& t)
|
|
{
|
|
assert(pos<=length());
|
|
tags.push_back(make_pair(pos,t));
|
|
}
|
|
|
|
#endif
|