view: extract span class into standalone class
This commit is contained in:
parent
2a72943ad7
commit
49e60e576f
@ -168,6 +168,8 @@ UTIL_FILES = \
|
|||||||
vector.ipp \
|
vector.ipp \
|
||||||
version.cpp \
|
version.cpp \
|
||||||
version.hpp \
|
version.hpp \
|
||||||
|
view.cpp \
|
||||||
|
view.hpp \
|
||||||
zlib.cpp \
|
zlib.cpp \
|
||||||
zlib.hpp
|
zlib.hpp
|
||||||
|
|
||||||
|
79
uri.cpp.rl
79
uri.cpp.rl
@ -22,9 +22,7 @@
|
|||||||
#include "debug.hpp"
|
#include "debug.hpp"
|
||||||
|
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
#include <cstring>
|
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <iterator>
|
|
||||||
|
|
||||||
|
|
||||||
%%{
|
%%{
|
||||||
@ -34,20 +32,20 @@
|
|||||||
action success {__success = true; }
|
action success {__success = true; }
|
||||||
action failure {__success = false; }
|
action failure {__success = false; }
|
||||||
|
|
||||||
action scheme_begin { m_spans[SCHEME].begin = p; }
|
action scheme_begin { m_views[SCHEME].begin = p; }
|
||||||
action scheme_end { m_spans[SCHEME].end = p; }
|
action scheme_end { m_views[SCHEME].end = p; }
|
||||||
|
|
||||||
action authority_begin { m_spans[AUTHORITY].begin = p; }
|
action authority_begin { m_views[AUTHORITY].begin = p; }
|
||||||
action authority_end { m_spans[AUTHORITY].end = p; }
|
action authority_end { m_views[AUTHORITY].end = p; }
|
||||||
|
|
||||||
action path_begin { m_spans[PATH].begin = p; }
|
action path_begin { m_views[PATH].begin = p; }
|
||||||
action path_end { m_spans[PATH].end = p; }
|
action path_end { m_views[PATH].end = p; }
|
||||||
|
|
||||||
action query_begin { m_spans[QUERY].begin = p; }
|
action query_begin { m_views[QUERY].begin = p; }
|
||||||
action query_end { m_spans[QUERY].end = p; }
|
action query_end { m_views[QUERY].end = p; }
|
||||||
|
|
||||||
action fragment_begin { m_spans[FRAGMENT].begin = p; }
|
action fragment_begin { m_views[FRAGMENT].begin = p; }
|
||||||
action fragment_end { m_spans[FRAGMENT].end = p; }
|
action fragment_end { m_views[FRAGMENT].end = p; }
|
||||||
|
|
||||||
## Characters
|
## Characters
|
||||||
unreserved = alpha | digit | "-" | "." | "_" | "~";
|
unreserved = alpha | digit | "-" | "." | "_" | "~";
|
||||||
@ -157,49 +155,6 @@
|
|||||||
}%%
|
}%%
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
// Span
|
|
||||||
|
|
||||||
util::uri::span::span ():
|
|
||||||
begin (nullptr),
|
|
||||||
end (nullptr)
|
|
||||||
{ ; }
|
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
util::uri::span::span (const char *str):
|
|
||||||
begin (str),
|
|
||||||
end (str + strlen (str))
|
|
||||||
{ ; }
|
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
bool
|
|
||||||
util::uri::span::span::empty (void) const
|
|
||||||
{
|
|
||||||
return begin == nullptr ||
|
|
||||||
end == nullptr ||
|
|
||||||
begin == end;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
size_t
|
|
||||||
util::uri::span::size (void) const
|
|
||||||
{
|
|
||||||
return end - begin;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
const char&
|
|
||||||
util::uri::span::operator[] (size_t idx) const
|
|
||||||
{
|
|
||||||
CHECK_LT (begin + idx, end);
|
|
||||||
return begin[idx];
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
// URI
|
// URI
|
||||||
|
|
||||||
@ -235,11 +190,11 @@ util::uri::uri (std::string &&_value):
|
|||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
util::uri::span
|
util::view
|
||||||
util::uri::get (util::uri::component c)
|
util::uri::get (util::uri::component c)
|
||||||
{
|
{
|
||||||
CHECK_NEQ (c, NUM_COMPONENTS);
|
CHECK_NEQ (c, NUM_COMPONENTS);
|
||||||
return m_spans[c];
|
return m_views[c];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@ -262,7 +217,7 @@ hex_to_uint (char c)
|
|||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
std::string
|
std::string
|
||||||
util::uri::percent_decode (span s)
|
util::uri::percent_decode (view s)
|
||||||
{
|
{
|
||||||
if (s.size () == 0)
|
if (s.size () == 0)
|
||||||
return std::string ();
|
return std::string ();
|
||||||
@ -304,14 +259,6 @@ util::uri::percent_decode (span s)
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
|
||||||
std::ostream&
|
|
||||||
util::operator<< (std::ostream &os, util::uri::span s)
|
|
||||||
{
|
|
||||||
std::copy (s.begin, s.end, std::ostream_iterator<char> (os));
|
|
||||||
return os;
|
|
||||||
}
|
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
std::ostream&
|
std::ostream&
|
||||||
util::operator<< (std::ostream &os, util::uri::component c)
|
util::operator<< (std::ostream &os, util::uri::component c)
|
||||||
|
22
uri.hpp
22
uri.hpp
@ -21,8 +21,9 @@
|
|||||||
#ifndef __UTIL_URI_HPP
|
#ifndef __UTIL_URI_HPP
|
||||||
#define __UTIL_URI_HPP
|
#define __UTIL_URI_HPP
|
||||||
|
|
||||||
|
#include "view.hpp"
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <cstdlib>
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
|
|
||||||
|
|
||||||
@ -46,29 +47,16 @@ namespace util {
|
|||||||
NUM_COMPONENTS
|
NUM_COMPONENTS
|
||||||
};
|
};
|
||||||
|
|
||||||
struct span {
|
view get (component);
|
||||||
span ();
|
|
||||||
span (const char*);
|
|
||||||
|
|
||||||
const char *begin;
|
static std::string percent_decode (view);
|
||||||
const char *end;
|
|
||||||
|
|
||||||
bool empty () const;
|
|
||||||
size_t size (void) const;
|
|
||||||
const char& operator[] (size_t) const;
|
|
||||||
};
|
|
||||||
|
|
||||||
span get (component);
|
|
||||||
|
|
||||||
static std::string percent_decode (span);
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
span m_spans[NUM_COMPONENTS];
|
view m_views[NUM_COMPONENTS];
|
||||||
std::string m_value;
|
std::string m_value;
|
||||||
};
|
};
|
||||||
|
|
||||||
std::ostream& operator<< (std::ostream&, uri::component);
|
std::ostream& operator<< (std::ostream&, uri::component);
|
||||||
std::ostream& operator<< (std::ostream&, uri::span);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
76
view.cpp
Normal file
76
view.cpp
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of libgim.
|
||||||
|
*
|
||||||
|
* libgim 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 3 of the License, or (at your option) any later
|
||||||
|
* version.
|
||||||
|
*
|
||||||
|
* libgim 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 libgim. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Copyright 2015 Danny Robson <danny@nerdcruft.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#include "view.hpp"
|
||||||
|
|
||||||
|
#include "debug.hpp"
|
||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
#include <iterator>
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
util::view::view ():
|
||||||
|
begin (nullptr),
|
||||||
|
end (nullptr)
|
||||||
|
{ ; }
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
util::view::view (const char *str):
|
||||||
|
begin (str),
|
||||||
|
end (str + strlen (str))
|
||||||
|
{ ; }
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
bool
|
||||||
|
util::view::view::empty (void) const
|
||||||
|
{
|
||||||
|
return begin == nullptr ||
|
||||||
|
end == nullptr ||
|
||||||
|
begin == end;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
size_t
|
||||||
|
util::view::size (void) const
|
||||||
|
{
|
||||||
|
return end - begin;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
const char&
|
||||||
|
util::view::operator[] (size_t idx) const
|
||||||
|
{
|
||||||
|
CHECK_LT (begin + idx, end);
|
||||||
|
return begin[idx];
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------
|
||||||
|
std::ostream&
|
||||||
|
util::operator<< (std::ostream &os, util::view s)
|
||||||
|
{
|
||||||
|
std::copy (s.begin, s.end, std::ostream_iterator<char> (os));
|
||||||
|
return os;
|
||||||
|
}
|
||||||
|
|
42
view.hpp
Normal file
42
view.hpp
Normal file
@ -0,0 +1,42 @@
|
|||||||
|
/*
|
||||||
|
* This file is part of libgim.
|
||||||
|
*
|
||||||
|
* libgim 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 3 of the License, or (at your option) any later
|
||||||
|
* version.
|
||||||
|
*
|
||||||
|
* libgim 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 libgim. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*
|
||||||
|
* Copyright 2015 Danny Robson <danny@nerdcruft.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
|
||||||
|
#ifndef __UTIL_VIEW_HPP
|
||||||
|
#define __UTIL_VIEW_HPP
|
||||||
|
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
namespace util {
|
||||||
|
struct view {
|
||||||
|
view ();
|
||||||
|
view (const char*);
|
||||||
|
|
||||||
|
const char *begin;
|
||||||
|
const char *end;
|
||||||
|
|
||||||
|
bool empty () const;
|
||||||
|
size_t size (void) const;
|
||||||
|
const char& operator[] (size_t) const;
|
||||||
|
};
|
||||||
|
|
||||||
|
std::ostream& operator<< (std::ostream&, view);
|
||||||
|
}
|
||||||
|
#endif
|
Loading…
Reference in New Issue
Block a user