// // tokenizer.hpp // string-utils // // Created by Sam Jaffe on 10/8/20. // Copyright © 2020 Sam Jaffe. All rights reserved. // #pragma once #include #include namespace string_utils { class tokenizer { public: static constexpr size_t const infinite_outputs{~size_t(0)}; struct quote { char on; std::string escaped; }; private: std::string divider_; quote quote_; size_t max_outputs_{infinite_outputs}; bool truncate_{false}; bool ignore_empty_tokens_{true}; bool escapable_{false}; bool reverse_search_{false}; public: tokenizer(std::string divider, struct quote quote = {'\0', ""}); tokenizer & max_outputs(size_t new_max_outputs); tokenizer & truncate(bool new_truncate_overage); tokenizer & ignore_empty_tokens(bool new_ignore_empty_tokens); tokenizer & escapable(bool new_escapable); tokenizer & reverse_search(bool new_reverse); std::vector operator()(std::string input) const; private: size_t max_outputs() const; }; inline auto split(std::string const & data, std::string const & on, size_t max = tokenizer::infinite_outputs) { return tokenizer{on}.max_outputs(max)(data); } inline auto rsplit(std::string const & data, std::string const & on, size_t max = tokenizer::infinite_outputs) { return tokenizer{on}.reverse_search(true).max_outputs(max)(data); } }