diff options
Diffstat (limited to 'include/ocl/fix/parser.hpp')
| -rw-r--r-- | include/ocl/fix/parser.hpp | 72 |
1 files changed, 14 insertions, 58 deletions
diff --git a/include/ocl/fix/parser.hpp b/include/ocl/fix/parser.hpp index 41d3638..4800a86 100644 --- a/include/ocl/fix/parser.hpp +++ b/include/ocl/fix/parser.hpp @@ -10,9 +10,11 @@ #include <ocl/fix/detail/config.hpp> #include <string> +#include <memory> namespace ocl::fix { + class visitor; struct range; class range_buffer; @@ -24,13 +26,6 @@ namespace ocl::fix using tag_type = std::string; using value_type = std::string; - namespace detail - { - inline const char* begin_fix() noexcept - { - return "FIX.4.2"; - } - } // namespace detail struct range final { @@ -66,7 +61,7 @@ namespace ocl::fix std::string magic_{}; string_hash_map<value_type> message_{}; - static inline const char* begin = detail::begin_fix(); + static inline const char* begin; explicit range_buffer() = default; ~range_buffer() = default; @@ -102,64 +97,25 @@ namespace ocl::fix /// @brief visitor object which returns a fix::range_buffer instance. class visitor final { - public: - static constexpr int soh = '\x01'; - static constexpr char eq = '='; - static constexpr unsigned base = 10U; - - explicit visitor() = default; - ~visitor() = default; + struct impl; + std::unique_ptr<impl> impl_; - visitor& operator=(const visitor&) = delete; - visitor(const visitor&) = delete; + public: + visitor() = default; - range_buffer operator()(const std::string& in) - { - return this->visit(in); - } + /// \brief Alias of visit. + range_buffer operator()(const boost::string_view& in); /// @brief Visits a FIX message and parse it into a range_buffer object. /// @param in The input FIX message as a string. /// @warning This function may throw exceptions. - range_buffer visit(const std::string& in) - { - range_buffer ret{}; - - if (in.empty()) - return ret; - - std::string key; - - std::size_t off = 0UL; - - while (off < in.size()) - { - std::size_t eq_pos = in.find(eq, off); - if (eq_pos == std::string::npos) - break; - - std::string tag = in.substr(off, eq_pos - off); - - std::size_t soh_pos = in.find(soh, eq_pos + 1); - if (soh_pos == std::string::npos) - soh_pos = in.size(); - - std::string value = in.substr(eq_pos + 1, soh_pos - eq_pos - 1); - - if (ret.magic_.empty()) - { - ret.magic_ = value; - ret.magic_len_ = value.size(); - } - - ret.message_[tag] = value; + range_buffer visit(const boost::string_view& in); + }; - off = soh_pos + 1; - } +#if !defined(OCL_FIX_HAS_IMPL) +struct visitor::impl {}; +#endif - return ret; - } - }; } // namespace ocl::fix #endif // ifndef __OCL_FIX_PARSER |
