summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/netlist/plib/pstring.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/lib/netlist/plib/pstring.h')
-rw-r--r--src/lib/netlist/plib/pstring.h135
1 files changed, 78 insertions, 57 deletions
diff --git a/src/lib/netlist/plib/pstring.h b/src/lib/netlist/plib/pstring.h
index df4d79d587f..e7c8b3ba0dc 100644
--- a/src/lib/netlist/plib/pstring.h
+++ b/src/lib/netlist/plib/pstring.h
@@ -9,6 +9,7 @@
#include <cstdarg>
#include <cstddef>
+#include <iterator>
#include "pconfig.h"
@@ -22,21 +23,22 @@
struct pstr_t
{
//str_t() : m_ref_count(1), m_len(0) { m_str[0] = 0; }
- pstr_t(const unsigned alen)
+ pstr_t(const std::size_t alen)
{
init(alen);
}
- void init(const unsigned alen)
+ void init(const std::size_t alen)
{
m_ref_count = 1;
m_len = alen;
m_str[0] = 0;
}
char *str() { return &m_str[0]; }
- unsigned len() const { return m_len; }
+ unsigned char *ustr() { return reinterpret_cast<unsigned char *>(&m_str[0]); }
+ std::size_t len() const { return m_len; }
int m_ref_count;
private:
- unsigned m_len;
+ std::size_t m_len;
char m_str[1];
};
@@ -47,8 +49,9 @@ struct pstring_t
public:
typedef F traits;
- typedef typename traits::mem_t mem_t;
- typedef typename traits::code_t code_t;
+ typedef typename F::mem_t mem_t;
+ typedef typename F::code_t code_t;
+ typedef std::size_t size_type;
// simple construction/destruction
pstring_t()
@@ -66,6 +69,26 @@ public:
pstring_t &operator=(const mem_t *string) { pcopy(string); return *this; }
pstring_t &operator=(const pstring_t &string) { pcopy(string); return *this; }
+ struct iterator final : public std::iterator<std::forward_iterator_tag, mem_t>
+ {
+ const mem_t * p;
+ public:
+ explicit constexpr iterator(const mem_t *x) noexcept : p(x) {}
+ iterator(const iterator &rhs) noexcept = default;
+ iterator(iterator &&rhs) noexcept { p = rhs.p; }
+ iterator &operator=(const iterator &it) { p = it.p; return *this; }
+ iterator& operator++() noexcept {p += traits::codelen(p); return *this;}
+ iterator operator++(int) noexcept {iterator tmp(*this); operator++(); return tmp;}
+ bool operator==(const iterator& rhs) noexcept {return p==rhs.p;}
+ bool operator!=(const iterator& rhs) noexcept {return p!=rhs.p;}
+ const code_t operator*() noexcept {return traits::code(p);}
+ iterator& operator+=(size_type count) { while (count>0) { --count; ++(*this); } return *this; }
+ friend iterator operator+(iterator lhs, const size_type &rhs) { return (lhs += rhs); }
+ };
+
+ iterator begin() const { return iterator(m_ptr->str()); }
+ iterator end() const { return iterator(m_ptr->str() + blen()); }
+
// C string conversion helpers
const mem_t *cstr() const { return m_ptr->str(); }
@@ -93,8 +116,8 @@ public:
bool equals(const pstring_t &string) const { return (pcmp(string) == 0); }
- int cmp(const pstring_t &string) const { return pcmp(string); }
- int cmp(const mem_t *string) const { return pcmp(string); }
+ //int cmp(const pstring_t &string) const { return pcmp(string); }
+ //int cmp(const mem_t *string) const { return pcmp(string); }
bool startsWith(const pstring_t &arg) const;
bool startsWith(const mem_t *arg) const;
@@ -107,47 +130,45 @@ public:
const pstring_t cat(const pstring_t &s) const { return *this + s; }
const pstring_t cat(const mem_t *s) const { return *this + s; }
- unsigned blen() const { return m_ptr->len(); }
+ size_type blen() const { return m_ptr->len(); }
// conversions
double as_double(bool *error = nullptr) const;
long as_long(bool *error = nullptr) const;
- unsigned len() const
+ size_type len() const
{
return traits::len(m_ptr);
}
- pstring_t& operator+=(const code_t c) { mem_t buf[F::MAXCODELEN+1] = { 0 }; F::encode(c, buf); pcat(buf); return *this; }
+ pstring_t& operator+=(const code_t c) { mem_t buf[traits::MAXCODELEN+1] = { 0 }; traits::encode(c, buf); pcat(buf); return *this; }
friend pstring_t operator+(const pstring_t &lhs, const code_t rhs) { return pstring_t(lhs) += rhs; }
- int find(const pstring_t &search, unsigned start = 0) const;
- int find(const mem_t *search, unsigned start = 0) const;
- int find(const code_t search, unsigned start = 0) const { mem_t buf[F::MAXCODELEN+1] = { 0 }; F::encode(search, buf); return find(buf, start); }
+ iterator find(const pstring_t &search, iterator start) const;
+ iterator find(const pstring_t &search) const { return find(search, begin()); }
+ iterator find(const mem_t *search, iterator start) const;
+ iterator find(const mem_t *search) const { return find(search, begin()); }
+ iterator find(const code_t search, iterator start) const { mem_t buf[traits::MAXCODELEN+1] = { 0 }; traits::encode(search, buf); return find(buf, start); }
+ iterator find(const code_t search) const { return find(search, begin()); }
- const pstring_t substr(unsigned start, unsigned count) const ;
- const pstring_t substr(unsigned start) const { if (start>=len()) return pstring_t(""); else return substr(start, len()-start); }
+ const pstring_t substr(const iterator start, const iterator end) const ;
+ const pstring_t substr(const iterator start) const { return substr(start, end()); }
+ const pstring_t substr(size_type start) const { if (start>=len()) return pstring_t(""); else return substr(begin() + start, end()); }
- const pstring_t left(unsigned count) const { return substr(0, count); }
- const pstring_t right(unsigned count) const { if (len()<count) return pstring_t(*this); else return substr(len() - count, count); }
+ const pstring_t left(iterator leftof) const { return substr(begin(), leftof); }
+ const pstring_t right(iterator pos) const { return substr(pos, end()); }
- int find_first_not_of(const pstring_t &no) const;
- int find_last_not_of(const pstring_t &no) const;
+ iterator find_first_not_of(const pstring_t &no) const;
+ iterator find_last_not_of(const pstring_t &no) const;
const pstring_t ltrim(const pstring_t &ws = " \t\n\r") const;
const pstring_t rtrim(const pstring_t &ws = " \t\n\r") const;
const pstring_t trim(const pstring_t &ws = " \t\n\r") const { return this->ltrim(ws).rtrim(ws); }
- const pstring_t rpad(const pstring_t &ws, const unsigned cnt) const;
-
- /*
- * everything below MAY not work for utf8.
- * Example a=s.find(EUROSIGN); b=s.substr(a,1); will deliver invalid utf8
- */
+ const pstring_t rpad(const pstring_t &ws, const size_type cnt) const;
- // FIXME:
- code_t code_at(const unsigned pos) const { return F::code(F::nthcode(m_ptr->str(),pos)); }
+ code_t code_at(const size_type pos) const { return F::code(F::nthcode(m_ptr->str(),pos)); }
const pstring_t ucase() const;
@@ -168,7 +189,7 @@ private:
int pcmp(const mem_t *right) const;
- void pcopy(const mem_t *from, int size);
+ void pcopy(const mem_t *from, std::size_t size);
void pcopy(const mem_t *from);
@@ -182,7 +203,7 @@ private:
void pcat(const mem_t *s);
void pcat(const pstring_t &s);
- static pstr_t *salloc(int n);
+ static pstr_t *salloc(std::size_t n);
static void sfree(pstr_t *s);
static pstr_t m_zero;
@@ -193,12 +214,12 @@ struct pu8_traits
static const unsigned MAXCODELEN = 1; /* in memory units */
typedef char mem_t;
typedef char code_t;
- static unsigned len(const pstr_t *p) { return p->len(); }
+ static std::size_t len(const pstr_t *p) { return p->len(); }
static unsigned codelen(const mem_t *p) { return 1; }
static unsigned codelen(const code_t c) { return 1; }
static code_t code(const mem_t *p) { return *p; }
static void encode(const code_t c, mem_t *p) { *p = c; }
- static const mem_t *nthcode(const mem_t *p, const unsigned n) { return &(p[n]); }
+ static const mem_t *nthcode(const mem_t *p, const std::size_t n) { return &(p[n]); }
};
/* No checking, this may deliver invalid codes */
@@ -207,10 +228,10 @@ struct putf8_traits
static const unsigned MAXCODELEN = 4; /* in memory units, RFC 3629 */
typedef char mem_t;
typedef unsigned code_t;
- static unsigned len(pstr_t *p)
+ static std::size_t len(pstr_t *p)
{
- unsigned ret = 0;
- unsigned char *c = (unsigned char *) p->str();
+ std::size_t ret = 0;
+ unsigned char *c = p->ustr();
while (*c)
{
if (!((*c & 0xC0) == 0x80))
@@ -221,7 +242,7 @@ struct putf8_traits
}
static unsigned codelen(const mem_t *p)
{
- unsigned char *p1 = (unsigned char *) p;
+ const unsigned char *p1 = reinterpret_cast<const unsigned char *>(p);
if ((*p1 & 0x80) == 0x00)
return 1;
else if ((*p1 & 0xE0) == 0xC0)
@@ -248,48 +269,48 @@ struct putf8_traits
}
static code_t code(const mem_t *p)
{
- unsigned char *p1 = (unsigned char *)p;
+ const unsigned char *p1 = reinterpret_cast<const unsigned char *>(p);
if ((*p1 & 0x80) == 0x00)
- return (code_t) *p1;
+ return *p1;
else if ((*p1 & 0xE0) == 0xC0)
- return ((p1[0] & 0x3f) << 6) | ((p1[1] & 0x3f));
+ return static_cast<code_t>(((p1[0] & 0x3f) << 6) | (p1[1] & 0x3f));
else if ((*p1 & 0xF0) == 0xE0)
- return ((p1[0] & 0x1f) << 12) | ((p1[1] & 0x3f) << 6) | ((p1[2] & 0x3f) << 0);
+ return static_cast<code_t>(((p1[0] & 0x1f) << 12) | ((p1[1] & 0x3f) << 6) | ((p1[2] & 0x3f) << 0));
else if ((*p1 & 0xF8) == 0xF0)
- return ((p1[0] & 0x0f) << 18) | ((p1[1] & 0x3f) << 12) | ((p1[2] & 0x3f) << 6) | ((p1[3] & 0x3f) << 0);
+ return static_cast<code_t>(((p1[0] & 0x0f) << 18) | ((p1[1] & 0x3f) << 12) | ((p1[2] & 0x3f) << 6) | ((p1[3] & 0x3f) << 0));
else
return *p1; // not correct
}
static void encode(const code_t c, mem_t *p)
{
- unsigned char *m = (unsigned char*)p;
+ unsigned char *m = reinterpret_cast<unsigned char *>(p);
if (c < 0x0080)
{
- m[0] = c;
+ m[0] = static_cast<unsigned char>(c);
}
else if (c < 0x800)
{
- m[0] = 0xC0 | (c >> 6);
- m[1] = 0x80 | (c & 0x3f);
+ m[0] = static_cast<unsigned char>(0xC0 | (c >> 6));
+ m[1] = static_cast<unsigned char>(0x80 | (c & 0x3f));
}
else if (c < 0x10000)
{
- m[0] = 0xE0 | (c >> 12);
- m[1] = 0x80 | ((c>>6) & 0x3f);
- m[2] = 0x80 | (c & 0x3f);
+ m[0] = static_cast<unsigned char>(0xE0 | (c >> 12));
+ m[1] = static_cast<unsigned char>(0x80 | ((c>>6) & 0x3f));
+ m[2] = static_cast<unsigned char>(0x80 | (c & 0x3f));
}
else /* U+10000 U+1FFFFF */
{
- m[0] = 0xF0 | (c >> 18);
- m[1] = 0x80 | ((c>>12) & 0x3f);
- m[2] = 0x80 | ((c>>6) & 0x3f);
- m[3] = 0x80 | (c & 0x3f);
+ m[0] = static_cast<unsigned char>(0xF0 | (c >> 18));
+ m[1] = static_cast<unsigned char>(0x80 | ((c>>12) & 0x3f));
+ m[2] = static_cast<unsigned char>(0x80 | ((c>>6) & 0x3f));
+ m[3] = static_cast<unsigned char>(0x80 | (c & 0x3f));
}
}
- static const mem_t *nthcode(const mem_t *p, const unsigned n)
+ static const mem_t *nthcode(const mem_t *p, const std::size_t n)
{
const mem_t *p1 = p;
- int i = n;
+ std::size_t i = n;
while (i-- > 0)
p1 += codelen(p1);
return p1;
@@ -358,7 +379,7 @@ public:
void cat(const pstring &s) { pcat(s); }
void cat(const char *s) { pcat(s); }
- void cat(const void *m, unsigned l) { pcat(m, l); }
+ void cat(const void *m, std::size_t l) { pcat(m, l); }
void clear() { m_len = 0; *m_ptr = 0; }
@@ -377,7 +398,7 @@ private:
void pcopy(const pstring &from);
void pcat(const char *s);
void pcat(const pstring &s);
- void pcat(const void *m, unsigned l);
+ void pcat(const void *m, std::size_t l);
char *m_ptr;
std::size_t m_size;
@@ -397,7 +418,7 @@ namespace std
const pstring::mem_t *string = s.cstr();
result_type result = 5381;
for (pstring::mem_t c = *string; c != 0; c = *string++)
- result = ((result << 5) + result ) ^ (result >> (32 - 5)) ^ c;
+ result = ((result << 5) + result ) ^ (result >> (32 - 5)) ^ static_cast<result_type>(c);
return result;
}
};