commit
f74126e0a8
4 changed files with 103 additions and 3 deletions
|
@ -11,7 +11,7 @@ matrix:
|
|||
env: CONFIGURE_OPTION='--enable-debug --enable-gcov' COVERALLS=yes VALGRIND=yes DEBUG=yes LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/
|
||||
# -D_BSD_SOURCE=1 is for asprintf
|
||||
- compiler: clang
|
||||
env: ASAN_OPTIONS=symbolize=1 ASAN_SYMBOLIZER_PATH=/usr/local/clang-3.4/bin/llvm-symbolizer CFLAGS='-fsanitize=address -g -O1 -D_BSD_SOURCE=1'
|
||||
env: ASAN_OPTIONS=symbolize=1 ASAN_SYMBOLIZER_PATH=/usr/local/clang-3.4/bin/llvm-symbolizer CFLAGS='-fsanitize=address -g -O1 -D_BSD_SOURCE=1' CXX=clang++ CXXFLAGS='-fsanitize=address -g -O1 -D_BSD_SOURCE=1'
|
||||
|
||||
install:
|
||||
- sudo apt-get update -qq
|
||||
|
@ -29,7 +29,7 @@ script:
|
|||
- make V=1
|
||||
- sudo make install
|
||||
- if [ "x$VALGRIND" == xyes ]; then make check > /dev/null 2>&1; else make check V=1; fi
|
||||
# XXX: tracing memory leak, disabled for some mystery reason for automake...
|
||||
# XXX: tracing memory leak, disabled for some mystery reason for automake...
|
||||
# - if [ "x$VALGRIND" == xyes && "x$DEBUG" == xyes ]; then valgrind ./tests/check_* -v --trace-children=yes --show-leak-kinds=full --leak-check=full; fi
|
||||
|
||||
after_success:
|
||||
|
|
|
@ -7,6 +7,7 @@ AM_INIT_AUTOMAKE([foreign subdir-objects])
|
|||
LT_INIT
|
||||
AC_PROG_CC
|
||||
AC_PROG_CC_STDC
|
||||
AC_PROG_CXX
|
||||
AC_PROG_INSTALL
|
||||
|
||||
# older debian
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
AM_CFLAGS=$(DEPS_CFLAGS) $(GVC_DEPS_CFLAGS) -I$(top_builddir)/include -Wall -std=c99
|
||||
AM_CXXFLAGS=$(DEPS_CXXFLAGS) $(GVC_DEPS_CXXFLAGS) -I$(top_builddir)/include -Wall
|
||||
AM_LDFLAGS=$(DEPS_LIBS) $(GVC_DEPS_LIBS) $(top_builddir)/libr3.la
|
||||
|
||||
noinst_PROGRAMS = simple
|
||||
noinst_PROGRAMS = simple simple_cpp
|
||||
simple_SOURCES = simple.c
|
||||
simple_cpp_SOURCES = simple_cpp.cpp
|
||||
|
|
97
examples/simple_cpp.cpp
Normal file
97
examples/simple_cpp.cpp
Normal file
|
@ -0,0 +1,97 @@
|
|||
#include <cstdlib>
|
||||
#include <cstring>
|
||||
#include <iostream>
|
||||
#include <r3.hpp>
|
||||
|
||||
using namespace std;
|
||||
|
||||
void example_1() {
|
||||
// create a router tree with 10 children capacity (this capacity can grow dynamically)
|
||||
r3::Tree tree(10);
|
||||
|
||||
// insert the route path into the router tree
|
||||
int route_data_1 = 1;
|
||||
tree.insert_path("/bar", &route_data_1); // ignore the length of path
|
||||
|
||||
int route_data_2 = 2;
|
||||
tree.insert_pathl("/zoo", strlen("/zoo"), &route_data_2);
|
||||
int route_data_3 = 3;
|
||||
tree.insert_pathl("/foo/bar", strlen("/foo/bar"), &route_data_3);
|
||||
|
||||
int route_data_4 = 4;
|
||||
tree.insert_pathl("/post/{id}", strlen("/post/{id}") , &route_data_4);
|
||||
|
||||
int route_data_5 = 5;
|
||||
tree.insert_pathl("/user/{id:\\d+}", strlen("/user/{id:\\d+}"),
|
||||
&route_data_5);
|
||||
|
||||
// if you want to catch error, you may call the extended path function for insertion
|
||||
int data = 10;
|
||||
char* errstr;
|
||||
r3::Node ret = tree.insert_pathl("/foo/{name:\\d{5}",
|
||||
strlen("/foo/{name:\\d{5}"), &data, &errstr);
|
||||
if (ret == NULL) {
|
||||
// failed insertion
|
||||
cout << "error: " << errstr << endl;
|
||||
free(errstr); // errstr is created from `asprintf`, so you have to free it manually.
|
||||
}
|
||||
|
||||
// let's compile the tree!
|
||||
int err = tree.compile(&errstr);
|
||||
if (err != 0) {
|
||||
cout << "error: " << errstr << endl;
|
||||
free(errstr); // errstr is created from `asprintf`, so you have to free it manually.
|
||||
}
|
||||
|
||||
// dump the compiled tree
|
||||
tree.dump(0);
|
||||
|
||||
// match a route
|
||||
r3::Node matched_node = tree.matchl("/foo/bar", strlen("/foo/bar"));
|
||||
if (matched_node) {
|
||||
int ret = *static_cast<int*>(matched_node.data());
|
||||
cout << "match path ret: " << ret << endl;
|
||||
}
|
||||
|
||||
r3::MatchEntry entry("/foo/bar");
|
||||
matched_node = tree.match_entry(entry);
|
||||
if (matched_node) {
|
||||
int ret = *static_cast<int*>(matched_node.data());
|
||||
cout << "match entry ret: " << ret << endl;
|
||||
}
|
||||
}
|
||||
|
||||
void example_2() {
|
||||
// create a router tree with 10 children capacity (this capacity can grow dynamically)
|
||||
r3::Tree tree(10);
|
||||
|
||||
// insert the route path into the router tree
|
||||
int route_data = 1;
|
||||
tree.insert_routel(METHOD_GET | METHOD_POST, "/blog/post",
|
||||
sizeof("/blog/post") - 1, &route_data);
|
||||
|
||||
char* errstr;
|
||||
int err = tree.compile(&errstr);
|
||||
if (err != 0) {
|
||||
cout << "errstr: " << errstr << endl;
|
||||
free(errstr); // errstr is created from `asprintf`, so you have to free it manually.
|
||||
}
|
||||
|
||||
// in your http server handler
|
||||
|
||||
// create the match entry for capturing dynamic variables.
|
||||
r3::MatchEntry entry("/blog/post");
|
||||
entry.set_request_method(METHOD_GET);
|
||||
|
||||
r3::Route matched_route = tree.match_route(entry);
|
||||
if (matched_route) {
|
||||
int ret = *static_cast<int*>(matched_route.data());
|
||||
cout << "match route ret: " << ret << endl;
|
||||
}
|
||||
}
|
||||
|
||||
int main() {
|
||||
example_1();
|
||||
example_2();
|
||||
return 0;
|
||||
}
|
Loading…
Reference in a new issue