diff options
Diffstat (limited to 'src/lib/netlist/plib/pstring.h')
-rw-r--r-- | src/lib/netlist/plib/pstring.h | 135 |
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; } }; |