diff options
author | 2019-09-21 22:14:56 +0200 | |
---|---|---|
committer | 2019-09-21 22:15:34 +0200 | |
commit | 8734df72ea0b69f6b327f2a088291498b8cb0517 (patch) | |
tree | a5d16c9e16688cb04d9887b2584ec251248082a4 /src/lib/netlist/plib | |
parent | aead1f98f422ad1ace6f667223a198115f190949 (diff) |
netlist code maintenance (nw)
- prepare move to c++ streams and later std::string
- fix more lint and clang pedantic warnings/errors
- fix some bugs
Diffstat (limited to 'src/lib/netlist/plib')
-rw-r--r-- | src/lib/netlist/plib/pfmtlog.cpp | 33 | ||||
-rw-r--r-- | src/lib/netlist/plib/pfmtlog.h | 24 | ||||
-rw-r--r-- | src/lib/netlist/plib/pfunction.cpp | 2 | ||||
-rw-r--r-- | src/lib/netlist/plib/pmain.cpp | 5 | ||||
-rw-r--r-- | src/lib/netlist/plib/pmain.h | 4 | ||||
-rw-r--r-- | src/lib/netlist/plib/pomp.h | 3 | ||||
-rw-r--r-- | src/lib/netlist/plib/poptions.cpp | 2 | ||||
-rw-r--r-- | src/lib/netlist/plib/pparser.cpp | 8 | ||||
-rw-r--r-- | src/lib/netlist/plib/pparser.h | 66 | ||||
-rw-r--r-- | src/lib/netlist/plib/ppmf.h | 2 | ||||
-rw-r--r-- | src/lib/netlist/plib/pstream.cpp | 10 | ||||
-rw-r--r-- | src/lib/netlist/plib/pstream.h | 88 | ||||
-rw-r--r-- | src/lib/netlist/plib/pstring.h | 14 | ||||
-rw-r--r-- | src/lib/netlist/plib/putil.cpp | 4 | ||||
-rw-r--r-- | src/lib/netlist/plib/putil.h | 24 | ||||
-rw-r--r-- | src/lib/netlist/plib/vector_ops.h | 1 |
16 files changed, 223 insertions, 67 deletions
diff --git a/src/lib/netlist/plib/pfmtlog.cpp b/src/lib/netlist/plib/pfmtlog.cpp index 2d2ee40562c..ef12e05fb1d 100644 --- a/src/lib/netlist/plib/pfmtlog.cpp +++ b/src/lib/netlist/plib/pfmtlog.cpp @@ -10,9 +10,9 @@ #include <algorithm> #include <array> -#include <iostream> -#include <iomanip> #include <cmath> +#include <iomanip> +#include <iostream> namespace plib { @@ -42,7 +42,7 @@ private: }; #endif -pfmt::rtype pfmt::setfmt(std::stringstream &strm, unsigned cfmt_spec) +pfmt::rtype pfmt::setfmt(std::stringstream &strm, char32_t cfmt_spec) { pstring fmt; pstring search("{"); @@ -50,11 +50,11 @@ pfmt::rtype pfmt::setfmt(std::stringstream &strm, unsigned cfmt_spec) rtype r; r.sl = search.size(); - r.p = m_str.find(search + ":"); + r.p = m_str.find(search + ':'); r.sl++; // ":" if (r.p == pstring::npos) // no further specifiers { - r.p = m_str.find(search + "}"); + r.p = m_str.find(search + '}'); if (r.p == pstring::npos) // not found try default { r.sl = 2; @@ -69,7 +69,7 @@ pfmt::rtype pfmt::setfmt(std::stringstream &strm, unsigned cfmt_spec) r.p = m_str.find("{:"); if (r.p != pstring:: npos) { - auto p1 = m_str.find("}", r.p); + auto p1 = m_str.find('}', r.p); if (p1 != pstring::npos) { r.sl = p1 - r.p + 1; @@ -81,7 +81,7 @@ pfmt::rtype pfmt::setfmt(std::stringstream &strm, unsigned cfmt_spec) else { // found absolute positional place holder - auto p1 = m_str.find("}", r.p); + auto p1 = m_str.find('}', r.p); if (p1 != pstring::npos) { r.sl = p1 - r.p + 1; @@ -92,11 +92,11 @@ pfmt::rtype pfmt::setfmt(std::stringstream &strm, unsigned cfmt_spec) if (r.p != pstring::npos) { // a.b format here ... - if (fmt != "" && pstring("duxofge").find(cfmt_spec) != pstring::npos) + if (fmt != "" && pstring("duxofge").find(static_cast<pstring::value_type>(cfmt_spec)) != pstring::npos) { - r.pend = fmt.at(fmt.size() - 1); - if (pstring("duxofge").find(r.pend) == pstring::npos) - r.pend = static_cast<pstring::value_type>(cfmt_spec); + r.pend = static_cast<char32_t>(fmt.at(fmt.size() - 1)); + if (pstring("duxofge").find(static_cast<pstring::value_type>(r.pend)) == pstring::npos) + r.pend = cfmt_spec; else fmt = plib::left(fmt, fmt.size() - 1); } @@ -104,16 +104,19 @@ pfmt::rtype pfmt::setfmt(std::stringstream &strm, unsigned cfmt_spec) // FIXME: Error r.pend = cfmt_spec; - int pdot(fmt.find('.')); + auto pdot(fmt.find('.')); if (pdot==0) strm << std::setprecision(pstonum<int>(fmt.substr(1))); - else if (r.p != pstring::npos) + else if (pdot != pstring::npos) { - strm << std::setprecision(pstonum<int>(fmt.substr(pdot + 1))) << std::setw(pstonum<int>(left(fmt,pdot))); + //strm << std::setprecision(pstonum<int>(fmt.substr(pdot + 1))) << std::setw(pstonum<int>(left(fmt,pdot))); + strm << std::setprecision(pstonum<int>(fmt.substr(pdot + 1))); + r.width = pstonum<pstring::size_type>(left(fmt,pdot)); } else if (fmt != "") - strm << std::setw(pstonum<int>(fmt)); + //strm << std::setw(pstonum<int>(fmt)); + r.width = pstonum<pstring::size_type>(fmt); switch (r.pend) { diff --git a/src/lib/netlist/plib/pfmtlog.h b/src/lib/netlist/plib/pfmtlog.h index 36dc9587d82..88bceb97e43 100644 --- a/src/lib/netlist/plib/pfmtlog.h +++ b/src/lib/netlist/plib/pfmtlog.h @@ -148,7 +148,7 @@ public: : m_str(fmt), m_locale(std::locale::classic()), m_arg(0) { } - explicit pfmt(std::locale loc, const pstring &fmt) + explicit pfmt(const std::locale &loc, const pstring &fmt) : m_str(fmt), m_locale(loc), m_arg(0) { } @@ -212,21 +212,28 @@ public: return format_element('o', x); } + friend std::ostream& operator<<(std::ostream &ostrm, const pfmt &fmt) + { + ostrm << fmt.m_str; + return ostrm; + } + protected: struct rtype { - rtype() : ret(0), p(0), sl(0), pend(0) {} + rtype() : ret(0), p(0), sl(0), pend(0), width(0) {} int ret; pstring::size_type p; pstring::size_type sl; - pstring::value_type pend; + char32_t pend; + pstring::size_type width; }; - rtype setfmt(std::stringstream &strm, unsigned cfmt_spec); + rtype setfmt(std::stringstream &strm, char32_t cfmt_spec); template <typename T> - pfmt &format_element(const unsigned cfmt_spec, T &&val) + pfmt &format_element(const char32_t cfmt_spec, T &&val) { rtype ret; @@ -239,7 +246,12 @@ protected: if (ret.ret>=0) { strm << std::forward<T>(val); - m_str = m_str.substr(0, ret.p) + pstring(strm.str()) + m_str.substr(ret.p + ret.sl); + const pstring ps(strm.str()); + pstring pad(""); + if (ret.width > ps.length()) + pad = pstring(ret.width - ps.length(), ' '); + + m_str = m_str.substr(0, ret.p) + pad + ps + m_str.substr(ret.p + ret.sl); } } while (ret.ret == 1); diff --git a/src/lib/netlist/plib/pfunction.cpp b/src/lib/netlist/plib/pfunction.cpp index 46bce2b4901..efbdcee6b6b 100644 --- a/src/lib/netlist/plib/pfunction.cpp +++ b/src/lib/netlist/plib/pfunction.cpp @@ -63,7 +63,7 @@ void pfunction::compile_postfix(const std::vector<pstring> &inputs, if (inputs[i] == cmd) { rc.m_cmd = PUSH_INPUT; - rc.m_param = i; + rc.m_param = static_cast<double>(i); stk += 1; break; } diff --git a/src/lib/netlist/plib/pmain.cpp b/src/lib/netlist/plib/pmain.cpp index b381d96dca7..6b8a5c1f3fb 100644 --- a/src/lib/netlist/plib/pmain.cpp +++ b/src/lib/netlist/plib/pmain.cpp @@ -35,10 +35,15 @@ namespace plib { app::app() : options() +#if !USE_CSTREAM , pout_strm() , perr_strm() , pout(&pout_strm) , perr(&perr_strm) +#else + , pout(&std::cout) + , perr(&std::cerr) +#endif { } diff --git a/src/lib/netlist/plib/pmain.h b/src/lib/netlist/plib/pmain.h index 7ee6257018b..2538ec23855 100644 --- a/src/lib/netlist/plib/pmain.h +++ b/src/lib/netlist/plib/pmain.h @@ -44,10 +44,10 @@ namespace plib { virtual pstring usage() = 0; virtual int execute() = 0; - +#if !USE_CSTREAM plib::pstdout pout_strm; plib::pstderr perr_strm; - +#endif plib::putf8_fmt_writer pout; plib::putf8_fmt_writer perr; diff --git a/src/lib/netlist/plib/pomp.h b/src/lib/netlist/plib/pomp.h index ba6299919b0..ecd9eacc41b 100644 --- a/src/lib/netlist/plib/pomp.h +++ b/src/lib/netlist/plib/pomp.h @@ -10,8 +10,9 @@ #define POMP_H_ #include "pconfig.h" +#include "ptypes.h" -//#include <cstddef> +#include <cstdint> #if HAS_OPENMP #include "omp.h" diff --git a/src/lib/netlist/plib/poptions.cpp b/src/lib/netlist/plib/poptions.cpp index 416b79e39d3..fa9a343815e 100644 --- a/src/lib/netlist/plib/poptions.cpp +++ b/src/lib/netlist/plib/poptions.cpp @@ -118,7 +118,7 @@ namespace plib { if (has_equal_arg) { for (std::size_t j = 1; j < v.size() - 1; j++) - opt_arg = opt_arg + v[j] + "="; + opt_arg += (v[j] + "="); opt_arg += v[v.size()-1]; } } diff --git a/src/lib/netlist/plib/pparser.cpp b/src/lib/netlist/plib/pparser.cpp index b640cbeaaf6..bcb3aba4ef3 100644 --- a/src/lib/netlist/plib/pparser.cpp +++ b/src/lib/netlist/plib/pparser.cpp @@ -264,7 +264,11 @@ void ptokenizer::error(const pstring &errs) // ---------------------------------------------------------------------------------------- ppreprocessor::ppreprocessor(defines_map_type *defines) +#if !USE_CSTREAM : pistream() +#else +: pistream(new st(this)) +#endif , m_ifflag(0) , m_level(0) , m_lineno(0) @@ -296,9 +300,10 @@ void ppreprocessor::error(const pstring &err) throw pexception("PREPRO ERROR: " + err); } +#if !USE_CSTREAM pstream::size_type ppreprocessor::vread(char_type *buf, const pstream::size_type n) { - size_type bytes = std::min(m_buf.size() - m_pos, n); + size_type bytes = std::min(m_buf.size() - m_pos, static_cast<std::size_t>(n)); if (bytes==0) return 0; @@ -307,6 +312,7 @@ pstream::size_type ppreprocessor::vread(char_type *buf, const pstream::size_type m_pos += bytes; return bytes; } +#endif #define CHECKTOK2(p_op, p_prio) \ else if (tok == # p_op) \ diff --git a/src/lib/netlist/plib/pparser.h b/src/lib/netlist/plib/pparser.h index c825132c23b..2d0aa861328 100644 --- a/src/lib/netlist/plib/pparser.h +++ b/src/lib/netlist/plib/pparser.h @@ -22,7 +22,12 @@ class ptokenizer public: template <typename T> ptokenizer(T &&strm) // NOLINT(misc-forwarding-reference-overload, bugprone-forwarding-reference-overload) - : m_strm(std::forward<T>(strm)), m_lineno(0), m_cur_line(""), m_px(m_cur_line.begin()), m_unget(0), m_string('"') + : m_strm(std::forward<T>(strm)) + , m_lineno(0) + , m_cur_line("") + , m_px(m_cur_line.begin()) + , m_unget(0) + , m_string('"') { } @@ -153,7 +158,11 @@ private: }; +#if !USE_CSTREAM class ppreprocessor : public pistream +#else +class ppreprocessor : public /*std::streambuf,*/ pistream +#endif { public: @@ -169,8 +178,14 @@ public: using defines_map_type = std::unordered_map<pstring, define_t>; explicit ppreprocessor(defines_map_type *defines = nullptr); +#if !USE_CSTREAM ~ppreprocessor() override = default; - +#else + ~ppreprocessor() override + { + delete rdbuf(); + } +#endif template <typename T> ppreprocessor & process(T &&istrm) { @@ -190,7 +205,13 @@ public: ppreprocessor(ppreprocessor &&s) noexcept - : m_defines(std::move(s.m_defines)) + //: pistream(s.rdbuf()) +#if !USE_CSTREAM + : pistream() +#else + : pistream(new st(this)) +#endif + , m_defines(std::move(s.m_defines)) , m_expr_sep(std::move(s.m_expr_sep)) , m_ifflag(s.m_ifflag) , m_level(s.m_level) @@ -204,14 +225,46 @@ public: protected: - size_type vread(char_type *buf, const size_type n) override; +#if !USE_CSTREAM + size_type vread(char_type *buf, const pos_type n) override; void vseek(const pos_type n) override { plib::unused_var(n); /* FIXME throw exception - should be done in base unless implemented */ } pos_type vtell() const override { return m_pos; } - +#else + class st : public std::streambuf + { + public: + st(ppreprocessor *strm) : m_strm(strm) { setg(nullptr, nullptr, nullptr); } + st(st &&rhs) noexcept : m_strm(rhs.m_strm) {} + int_type underflow() override + { + //printf("here\n"); + if (this->gptr() == this->egptr()) + { + /* clang reports sign error - weird */ + std::size_t bytes = pstring_mem_t_size(m_strm->m_buf) - static_cast<std::size_t>(m_strm->m_pos); + + if (bytes > m_buf.size()) + bytes = m_buf.size(); + std::copy(m_strm->m_buf.c_str() + m_strm->m_pos, m_strm->m_buf.c_str() + m_strm->m_pos + bytes, m_buf.data()); + //printf("%ld\n", (long int)bytes); + this->setg(m_buf.data(), m_buf.data(), m_buf.data() + bytes); + + m_strm->m_pos += static_cast</*pos_type*/long>(bytes); + } + return this->gptr() == this->egptr() + ? std::char_traits<char>::eof() + : std::char_traits<char>::to_int_type(*this->gptr()); + } + private: + ppreprocessor *m_strm; + std::array<char_type, 1024> m_buf; + }; + //friend class st; +#endif int expr(const std::vector<pstring> &sexpr, std::size_t &start, int prio); define_t *get_define(const pstring &name); pstring replace_macros(const pstring &line); @@ -224,6 +277,7 @@ private: PROCESS, LINE_CONTINUATION }; + pstring process_line(pstring line); pstring process_comments(pstring line); @@ -234,7 +288,7 @@ private: int m_level; int m_lineno; pstring_t<pu8_traits> m_buf; - pos_type m_pos; + pistream::pos_type m_pos; state_e m_state; pstring m_line; bool m_comment; diff --git a/src/lib/netlist/plib/ppmf.h b/src/lib/netlist/plib/ppmf.h index 4eb90fd45b6..9ee759befa4 100644 --- a/src/lib/netlist/plib/ppmf.h +++ b/src/lib/netlist/plib/ppmf.h @@ -10,7 +10,7 @@ #include "pconfig.h" -//#include <cstdint> +#include <cstdint> // uintptr_t #include <utility> /* diff --git a/src/lib/netlist/plib/pstream.cpp b/src/lib/netlist/plib/pstream.cpp index d06e19aff94..4d6b8144760 100644 --- a/src/lib/netlist/plib/pstream.cpp +++ b/src/lib/netlist/plib/pstream.cpp @@ -33,6 +33,8 @@ namespace plib { // Input file stream // ----------------------------------------------------------------------------- +#if !USE_CSTREAM + pifilestream::pifilestream(const pstring &fname) : pistream(0) , m_file(fopen(fname.c_str(), "rb")) @@ -119,6 +121,7 @@ pstdin::pstdin() { /* nothing to do */ } +#endif // ----------------------------------------------------------------------------- // Output file stream @@ -223,13 +226,11 @@ pstream::pos_type pomemstream::vtell() const return m_pos; } -#endif // ----------------------------------------------------------------------------- // pstderr: write to stderr // ----------------------------------------------------------------------------- -#if 1 pstderr::pstderr() #ifdef _WIN32 : pofilestream(fdopen(_dup(fileno(stderr)), "wb"), "<stderr>", true) @@ -252,6 +253,9 @@ pstdout::pstdout() { } #endif + +#if !USE_CSTREAM + // ----------------------------------------------------------------------------- // Memory stream // ----------------------------------------------------------------------------- @@ -299,7 +303,7 @@ pimemstream::pos_type pimemstream::vtell() const { return m_pos; } - +#endif bool putf8_reader::readline(pstring &line) { diff --git a/src/lib/netlist/plib/pstream.h b/src/lib/netlist/plib/pstream.h index dfa29dbfb93..e8e47a4c623 100644 --- a/src/lib/netlist/plib/pstream.h +++ b/src/lib/netlist/plib/pstream.h @@ -19,20 +19,27 @@ #include <array> #include <type_traits> #include <vector> +#include <ios> #if USE_CSTREAM #include <fstream> //#include <strstream> +#include <iostream> #include <sstream> #endif namespace plib { #if USE_CSTREAM -typedef std::ostream postream; -typedef std::ofstream pofilestream; -typedef std::ostringstream postringstream; -typedef std::ostringstream pomemstream; +using postream = std::ostream; +using pofilestream = std::ofstream; +using postringstream = std::ostringstream; +using pomemstream = std::ostringstream; + +using pistream = std::istream; +using pifilestream = std::ifstream; +using pistringstream = std::istringstream; +using pimemstream = std::istringstream; #endif @@ -44,8 +51,8 @@ class pstream { public: - using pos_type = std::size_t; - using size_type = std::size_t; + using pos_type = std::streamsize; + using size_type = std::streamsize; static constexpr pos_type SEEK_EOF = static_cast<pos_type>(-1); @@ -95,6 +102,8 @@ private: unsigned m_flags; }; +#if !USE_CSTREAM + // ----------------------------------------------------------------------------- // pistream: input stream // ----------------------------------------------------------------------------- @@ -133,7 +142,6 @@ using pistream = pistream_base<char>; // postream: output stream // ----------------------------------------------------------------------------- -#if !USE_CSTREAM template <typename T> class postream_base : public pstream { @@ -195,7 +203,7 @@ public: ~pomemstream() override = default; const char *memory() const { return m_mem.data(); } - pos_type size() const { return m_mem.size(); } + pos_type size() const { return static_cast<pos_type>(m_mem.size()); } protected: /* write n bytes to stream */ @@ -230,10 +238,10 @@ protected: void vwrite(const char_type *buf, const pos_type n) override { //m_buf += pstring(reinterpret_cast<const pstring::mem_t *>(buf), n); - m_buf += pstring(buf, n); + m_buf += pstring(buf, static_cast<pstring::size_type>(n)); } void vseek(const pos_type n) override { unused_var(n); } - pos_type vtell() const override { return m_buf.size(); } + pos_type vtell() const override { return static_cast<pos_type>(m_buf.size()); } private: pstring m_buf; @@ -282,7 +290,6 @@ private: // ----------------------------------------------------------------------------- // pstderr: write to stderr // ----------------------------------------------------------------------------- -#endif class pstderr : public pofilestream { @@ -310,6 +317,7 @@ public: ~pstdout() noexcept override = default; }; + // ----------------------------------------------------------------------------- // pifilestream: file input stream // ----------------------------------------------------------------------------- @@ -423,12 +431,12 @@ public: : pimemstream() , m_str(str) { - set_mem(m_str.c_str(), pstring_mem_t_size(m_str)); + set_mem(m_str.c_str(), static_cast<pos_type>(pstring_mem_t_size(m_str))); } pistringstream(pistringstream &&src) noexcept : pimemstream(std::move(src)), m_str(src.m_str) { - set_mem(m_str.c_str(), pstring_mem_t_size(m_str)); + set_mem(m_str.c_str(), static_cast<pos_type>(pstring_mem_t_size(m_str))); } COPYASSIGN(pistringstream, delete) pistringstream &operator=(pistringstream &&src) = delete; @@ -439,6 +447,7 @@ private: /* only needed for a reference till destruction */ const pstring m_str; }; +#endif // ----------------------------------------------------------------------------- // putf8reader_t: reader on top of istream @@ -473,6 +482,8 @@ public: bool eof() const { return m_strm->eof(); } bool readline(pstring &line); + +#if !USE_CSTREAM bool readbyte1(pistream::char_type &b) { return (m_strm->read(&b, 1) == 1); @@ -490,7 +501,32 @@ public: c = putf8string::traits_type::code(reinterpret_cast<putf8string::traits_type::mem_t *>(&b)); return true; } +#else + bool readbyte1(pistream::char_type &b) + { + if (m_strm->eof()) + return false; + m_strm->read(&b, 1); + return true; + } + bool readcode(putf8string::traits_type::code_t &c) + { + std::array<pistream::char_type, 4> b{0}; + if (m_strm->eof()) + return false; + m_strm->read(&b[0], 1); + const std::size_t l = putf8string::traits_type::codelen(reinterpret_cast<putf8string::traits_type::mem_t *>(&b)); + for (std::size_t i = 1; i < l; i++) + { + if (m_strm->eof()) + return false; + m_strm->read(&b[i], 1); + } + c = putf8string::traits_type::code(reinterpret_cast<putf8string::traits_type::mem_t *>(&b)); + return true; + } +#endif private: plib::unique_ptr<pistream> m_strm; putf8string m_linebuf; @@ -535,7 +571,7 @@ public: { // NOLINTNEXTLINE(performance-unnecessary-copy-initialization) const putf8string conv_utf8(text); - m_strm->write(conv_utf8.c_str(), plib::strlen(conv_utf8.c_str())); + m_strm->write(conv_utf8.c_str(), static_cast<std::streamsize>(plib::strlen(conv_utf8.c_str()))); } void write(const pstring::value_type c) const @@ -592,7 +628,7 @@ public: void write(const pstring &s) { const auto sm = reinterpret_cast<const postream::char_type *>(s.c_str()); - const std::size_t sl(pstring_mem_t_size(s)); + const std::streamsize sl(static_cast<std::streamsize>(pstring_mem_t_size(s))); write(sl); m_strm.write(sm, sl); } @@ -600,9 +636,9 @@ public: template <typename T> void write(const std::vector<T> &val) { - std::size_t sz = val.size(); + const std::streamsize sz(static_cast<std::streamsize>(val.size())); write(sz); - m_strm.write(reinterpret_cast<const postream::char_type *>(val.data()), sizeof(T) * sz); + m_strm.write(reinterpret_cast<const postream::char_type *>(val.data()), sz * static_cast<std::streamsize>(sizeof(T))); } private: @@ -631,7 +667,7 @@ public: std::size_t sz = 0; read(sz); std::vector<plib::string_info<pstring>::mem_t> buf(sz+1); - m_strm.read(buf.data(), sz); + m_strm.read(buf.data(), static_cast<std::streamsize>(sz)); buf[sz] = 0; s = pstring(buf.data()); } @@ -642,7 +678,7 @@ public: std::size_t sz = 0; read(sz); val.resize(sz); - m_strm.read(reinterpret_cast<pistream::char_type *>(val.data()), sizeof(T) * sz); + m_strm.read(reinterpret_cast<pistream::char_type *>(val.data()), static_cast<std::streamsize>(sizeof(T) * sz)); } private: @@ -651,10 +687,20 @@ private: inline void copystream(postream &dest, pistream &src) { + // FIXME: optimize +#if !USE_CSTREAM std::array<postream::char_type, 1024> buf; // NOLINT(cppcoreguidelines-pro-type-member-init) pstream::pos_type r; while ((r=src.read(buf.data(), 1024)) > 0) dest.write(buf.data(), r); +#else + std::array<postream::char_type, 1024> buf; // NOLINT(cppcoreguidelines-pro-type-member-init) + while (!src.eof()) + { + src.read(buf.data(), 1); + dest.write(buf.data(), 1); + } +#endif } struct perrlogger @@ -667,8 +713,12 @@ struct perrlogger private: static putf8_fmt_writer &h() { +#if !USE_CSTREAM static plib::pstderr perr_strm; static plib::putf8_fmt_writer perr(&perr_strm); +#else + static plib::putf8_fmt_writer perr(&std::cerr); +#endif return perr; } }; diff --git a/src/lib/netlist/plib/pstring.h b/src/lib/netlist/plib/pstring.h index cc4a70bc9aa..bbbe48147d2 100644 --- a/src/lib/netlist/plib/pstring.h +++ b/src/lib/netlist/plib/pstring.h @@ -186,6 +186,7 @@ public: pstring_t& operator+=(const code_t c) { traits_type::encode(c, m_str); return *this; } friend pstring_t operator+(const pstring_t &lhs, const pstring_t &rhs) { return pstring_t(lhs) += rhs; } friend pstring_t operator+(const pstring_t &lhs, const code_t rhs) { return pstring_t(lhs) += rhs; } + friend pstring_t operator+(const code_t lhs, const pstring_t &rhs) { return pstring_t(1, lhs) += rhs; } // comparison operators bool operator==(const pstring_t &string) const { return (compare(string) == 0); } @@ -196,6 +197,12 @@ public: bool operator>(const pstring_t &string) const { return (compare(string) > 0); } bool operator>=(const pstring_t &string) const { return (compare(string) >= 0); } + friend std::ostream& operator<<(std::ostream &ostrm, const pstring_t &str) + { + ostrm << str.m_str; + return ostrm; + } + const_reference at(const size_type pos) const { return *reinterpret_cast<const ref_value_type *>(F::nthcode(m_str.c_str(),pos)); } static constexpr const size_type npos = static_cast<size_type>(-1); @@ -475,11 +482,12 @@ extern template struct pstring_t<putf16_traits>; extern template struct pstring_t<pwchar_traits>; #if (PSTRING_USE_STD_STRING) -typedef std::string pstring; +using pstring = std::string; static inline pstring::size_type pstring_mem_t_size(const pstring &s) { return s.size(); } #else using pstring = pstring_t<putf8_traits>; -static inline pstring::size_type pstring_mem_t_size(const pstring &s) { return s.mem_t_size(); } +template <typename T> +static inline pstring::size_type pstring_mem_t_size(const pstring_t<T> &s) { return s.mem_t_size(); } #endif using putf8string = pstring_t<putf8_traits>; using pu16string = pstring_t<putf16_traits>; @@ -618,7 +626,7 @@ namespace plib const T *p = str; while (*p) p++; - return p - str; + return static_cast<std::size_t>(p - str); } template<typename T> diff --git a/src/lib/netlist/plib/putil.cpp b/src/lib/netlist/plib/putil.cpp index fd5ab040cca..a9531006904 100644 --- a/src/lib/netlist/plib/putil.cpp +++ b/src/lib/netlist/plib/putil.cpp @@ -25,7 +25,7 @@ namespace plib #ifdef _WIN32 ret = ret + '\\' + elem; #else - ret = ret + '/' + elem; + ret += ('/' + elem); #endif } return ret; @@ -137,7 +137,7 @@ namespace plib int penum_base::from_string_int(const char *str, const char *x) { int cnt = 0; - for (auto s : psplit(str, ",", false)) + for (auto &s : psplit(str, ",", false)) { if (s == x) return cnt; diff --git a/src/lib/netlist/plib/putil.h b/src/lib/netlist/plib/putil.h index 0a1bf258f5d..940a6845b16 100644 --- a/src/lib/netlist/plib/putil.h +++ b/src/lib/netlist/plib/putil.h @@ -12,9 +12,10 @@ #include "pstring.h" #include <algorithm> #include <initializer_list> +#include <locale> #include <sstream> #include <vector> -#include <locale> +#include <iostream> #define PSTRINGIFY_HELP(y) # y #define PSTRINGIFY(x) PSTRINGIFY_HELP(x) @@ -131,16 +132,16 @@ namespace plib // ---------------------------------------------------------------------------------------- template <typename T, typename S> - T pstonum_locale(std::locale loc, const S &arg, std::size_t *idx) + T pstonum_locale(const std::locale &loc, const S &arg, std::size_t *idx) { std::stringstream ss; ss.imbue(loc); ss << arg; - long int len(ss.tellp()); - auto x(constants<long double>::zero()); + auto len(ss.tellp()); + T x(constants<T>::zero()); if (ss >> x) { - long int pos(ss.tellg()); + auto pos(ss.tellg()); if (pos == -1) pos = len; *idx = static_cast<std::size_t>(pos); @@ -155,7 +156,7 @@ namespace plib struct pstonum_helper; template<typename T> - struct pstonum_helper<T, typename std::enable_if<std::is_integral<T>::value>::type> + struct pstonum_helper<T, typename std::enable_if<std::is_integral<T>::value && std::is_signed<T>::value>::type> { template <typename S> long long operator()(std::locale loc, const S &arg, std::size_t *idx) @@ -166,6 +167,17 @@ namespace plib }; template<typename T> + struct pstonum_helper<T, typename std::enable_if<std::is_integral<T>::value && !std::is_signed<T>::value>::type> + { + template <typename S> + unsigned long long operator()(std::locale loc, const S &arg, std::size_t *idx) + { + //return std::stoll(arg, idx); + return pstonum_locale<unsigned long long>(loc, arg, idx); + } + }; + + template<typename T> struct pstonum_helper<T, typename std::enable_if<std::is_floating_point<T>::value>::type> { template <typename S> diff --git a/src/lib/netlist/plib/vector_ops.h b/src/lib/netlist/plib/vector_ops.h index d1d28261f5f..bdeb24ae502 100644 --- a/src/lib/netlist/plib/vector_ops.h +++ b/src/lib/netlist/plib/vector_ops.h @@ -13,6 +13,7 @@ #include "pconfig.h" #include <algorithm> +#include <array> #include <cmath> #include <type_traits> |