preparing compile time url parsing

This commit is contained in:
ipknHama 2014-04-03 01:38:08 +09:00
parent 4fdff79719
commit 5e5d696884
6 changed files with 126 additions and 2 deletions

3
.gitignore vendored
View File

@ -19,3 +19,6 @@
*.exe
*.out
*.app
example
unittest

View File

@ -1,4 +1,4 @@
all: example
all: example unittest
example: example.cpp flask.h http_server.h http_connection.h parser.h http_response.h
g++ -g -std=c++11 -o example example.cpp http-parser/http_parser.c -pthread -lboost_system -lboost_thread -I http-parser/
test: example
@ -6,3 +6,6 @@ test: example
./example &
python test.py || exit 0
pkill example
unittest: unittest.cpp routing.h
g++ -g -std=c++11 -o unittest unittest.cpp

View File

@ -32,7 +32,7 @@ namespace flask
template <typename F>
void route(const std::string& url, F f)
{
auto yameHandler = [f]{
auto yameHandler = [f = std::move(f)]{
return response(f());
};
yameHandlers_.emplace(url, yameHandler);

39
routing.h Normal file
View File

@ -0,0 +1,39 @@
#pragma once
#include <cstdint>
#include "utility.h"
namespace flask
{
namespace black_magic
{
constexpr bool is_equ_n(StrWrap a, int ai, StrWrap b, int bi, int n)
{
return n == 0 ? true : a[ai] != b[bi] ? false : is_equ_n(a,ai+1,b,bi+1,n-1);
}
constexpr bool is_int(StrWrap s, int i)
{
return is_equ_n(s, i, "<int>", 0, 5);
}
constexpr bool is_str(StrWrap s, int i)
{
return is_equ_n(s, i, "<str>", 0, 5);
}
//constexpr ? parse_route(StrWrap s)
//{
//return
//}
}
class Router
{
public:
constexpr Router(black_magic::StrWrap s)
{
}
};
}

27
unittest.cpp Normal file
View File

@ -0,0 +1,27 @@
#include "routing.h"
#include <functional>
#include "utility.h"
using namespace flask;
using namespace flask::black_magic;
template <int N> struct T{};
int main()
{
try
{
throw T<is_int("1<int>22",0)>();
}
catch(T<0>)
{
}
try
{
throw T<is_int("1<int>22",1)>();
}
catch(T<1>)
{
}
}

52
utility.h Normal file
View File

@ -0,0 +1,52 @@
#pragma once
namespace flask
{
namespace black_magic
{
struct OutOfRange
{
OutOfRange(unsigned pos, unsigned length) {}
};
constexpr unsigned requires_in_range( unsigned i, unsigned len )
{
return i >= len ? throw OutOfRange(i, len) : i;
}
// from http://akrzemi1.wordpress.com/2011/05/11/parsing-strings-at-compile-time-part-i/
class StrWrap
{
const char * const begin_;
unsigned size_;
public:
template< unsigned N >
constexpr StrWrap( const char(&arr)[N] ) : begin_(arr), size_(N - 1) {
static_assert( N >= 1, "not a string literal");
}
constexpr char operator[]( unsigned i ) {
return requires_in_range(i, size_), begin_[i];
}
constexpr operator const char *() {
return begin_;
}
constexpr unsigned size() {
return size_;
}
};
constexpr int find_closing_tag(StrWrap s, std::size_t p)
{
return s[p] == '>' ? p : find_closing_tag(s, p+1);
}
constexpr int count(StrWrap s, int i=0)
{
return i == s.size() ? 0 : s[i] == '<' ? 1+count(s,i+1) : count(s,i+1);
}
}
}