/* * charybdis: an advanced ircd. * inline/stringops.h: inlined string operations used in a few places * * Copyright (C) 2005-2016 Charybdis Development Team * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 * USA */ #include ; const delim d(sep); const boost::tokenizer view(str, d); std::for_each(begin(view), end(view), closure); } const std::string & ircd::token(const std::string &str, const char *const &sep, const size_t &at) { using delim = boost::char_separator; const delim d(sep); const boost::tokenizer view(str, d); size_t i(0); auto it(begin(view)); for(; it != end(view); ++it, i++) if(i == at) return *it; // Moving the iterator may cause a parse, so there is no pre-check on the bounds; // the valid token is returned in the loop, and exiting the loop is an error. throw std::out_of_range("token out of range"); } const std::string & ircd::token_last(const std::string &str, const char *const &sep) { using delim = boost::char_separator; const delim d(sep); const boost::tokenizer view(str, d); auto it(begin(view)); if(it == end(view)) throw std::out_of_range("token out of range"); auto ret(it); while(it != end(view)) ret = it++; return *ret; } size_t ircd::token_count(const std::string &str, const char *const &sep) { using delim = boost::char_separator; const delim d(sep); const boost::tokenizer view(str, d); return std::distance(begin(view), end(view)); }