From ad010c5ab4b49ae050a7348249c98023f154c19f Mon Sep 17 00:00:00 2001 From: Joshua Moerman Date: Sun, 10 Mar 2013 12:41:04 +0100 Subject: [PATCH] Split main into more headers --- src/app.h | 42 ++++++++++++++++++++ src/basics.h | 47 ++++++++++++++++++++++ src/json_ext.h | 12 ++++++ src/main.cpp | 103 +++++++------------------------------------------ 4 files changed, 116 insertions(+), 88 deletions(-) create mode 100644 src/app.h create mode 100644 src/basics.h create mode 100644 src/json_ext.h diff --git a/src/app.h b/src/app.h new file mode 100644 index 0000000..73e025f --- /dev/null +++ b/src/app.h @@ -0,0 +1,42 @@ +#pragma once + +#include +#include +#include +#include + +#include "basics.h" + +struct App{ + std::vector people_online; + int uid{0}; + + void update_positions(){ + const float speed = 0.4; + + typedef std::chrono::duration> fseconds; + static auto start = std::chrono::steady_clock::now(); + auto end = std::chrono::steady_clock::now(); + double time = std::chrono::duration_cast(end-start).count(); + + //std::cout << time << std::endl; + auto n = people_online.size(); + for(int i = 0; i < n; ++i){ + User& user = *people_online[i]; + double x = cos(speed * time + 2*M_PI*i/double(n)); + double y = sin(speed * time + 2*M_PI*i/double(n)); + + user.position.x = 200 + 200*x; + user.position.y = 200 + 200*y; + } + } + + void login(User& user){ + user.index = uid++; + people_online.push_back(&user); + } + + void logout(User& user){ + people_online.erase(std::remove(people_online.begin(), people_online.end(), &user), people_online.end()); + } +}; \ No newline at end of file diff --git a/src/basics.h b/src/basics.h new file mode 100644 index 0000000..c7baa29 --- /dev/null +++ b/src/basics.h @@ -0,0 +1,47 @@ +#pragma once + +#include +#include +#include + +struct Empty{}; + +BOOST_FUSION_DEFINE_STRUCT( + , Size, + (int, width) + (int, height) +) + +BOOST_FUSION_DEFINE_STRUCT( + , Position, + (int, x) + (int, y) +) + +BOOST_FUSION_DEFINE_STRUCT( + , IncomingPacket, + (std::string, name) + (Size, size) +) + +struct User { + unsigned int index{0}; + std::string name{"Unknown guest"}; + + Size size{0,0}; + Position position{0,0}; + + User& operator=(IncomingPacket const & p){ + name = p.name; + size = p.size; + return *this; + } +}; + +BOOST_FUSION_ADAPT_STRUCT( + User, + (unsigned int, index) + (std::string, name) + (Size, size) + (Position, position) +) diff --git a/src/json_ext.h b/src/json_ext.h new file mode 100644 index 0000000..ca95370 --- /dev/null +++ b/src/json_ext.h @@ -0,0 +1,12 @@ +#pragma once + +#include "json.h" + +template +inline js::Value ptrvector_to_json(C const & container){ + js::Array array; + for(auto x : container){ + array.push_back(to_json(*x)); + } + return array; +} diff --git a/src/main.cpp b/src/main.cpp index ebcb94c..5af8427 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -1,105 +1,32 @@ - +#include #include -#include -#include -#include -#include +#include #include -#include "json.h" #include "websockets.h" -template -inline js::Value ptrvector_to_json(C const & container){ - js::Array array; - for(auto x : container){ - array.push_back(to_json(*x)); - } - return array; -} - -BOOST_FUSION_DEFINE_STRUCT( - , Size, - (int, width) - (int, height) -) - -BOOST_FUSION_DEFINE_STRUCT( - , Position, - (int, x) - (int, y) -) - -BOOST_FUSION_DEFINE_STRUCT( - , IncomingPacket, - (std::string, name) - (Size, size) -) - -int uid = 0; -struct User { - unsigned int index{0}; - std::string name{"Unknown guest"}; - - Size size{0,0}; - Position position{0,0}; - - User() - : index(uid++) - {} - - User& operator=(IncomingPacket const & p){ - name = p.name; - size = p.size; - return *this; - } -}; - -BOOST_FUSION_ADAPT_STRUCT( - User, - (unsigned int, index) - (std::string, name) - (Size, size) - (Position, position) -) - -// unfortunately libwebsockets owns the user thingy -std::vector people_online; - -inline void update_positions(){ - const float speed = 0.4; - - typedef std::chrono::duration> fseconds; - static auto start = std::chrono::steady_clock::now(); - auto end = std::chrono::steady_clock::now(); - double time = std::chrono::duration_cast(end-start).count(); +#include "json.h" +#include "json_ext.h" - //std::cout << time << std::endl; - auto n = people_online.size(); - for(int i = 0; i < n; ++i){ - User& user = *people_online[i]; - double x = cos(speed * time + 2*M_PI*i/double(n)); - double y = sin(speed * time + 2*M_PI*i/double(n)); +#include "basics.h" +#include "app.h" - user.position.x = 200 + 200*x; - user.position.y = 200 + 200*y; - } -} +std::unique_ptr app; websockets::TestProtocol default_protocol{ // connection established [](User& user){ - people_online.push_back(&user); + app->login(user); }, // connection closed [](User& user){ - people_online.erase(std::remove(people_online.begin(), people_online.end(), &user), people_online.end()); + app->logout(user); }, // write (will always come after receive) [](User& user) -> std::string{ - update_positions(); - return write_json(ptrvector_to_json(people_online)); + app->update_positions(); + return write_json(ptrvector_to_json(app->people_online)); }, // receive [](User& user, std::string in){ @@ -111,8 +38,6 @@ websockets::TestProtocol default_protocol{ } }; -struct Empty{}; - websockets::TestProtocol observer_protocol{ // connection established [](Empty& user){}, @@ -120,14 +45,16 @@ websockets::TestProtocol observer_protocol{ [](Empty& user){}, // write (will always come after receive) [](Empty& user) -> std::string{ - update_positions(); - return write_json(ptrvector_to_json(people_online)); + app->update_positions(); + return write_json(ptrvector_to_json(app->people_online)); }, // receive [](Empty& user, std::string in){} }; int main(int argc, char **argv){ + app.reset(new App); + libwebsocket_protocols protocols[] = { WSstandard_protocol("default", default_protocol), WSstandard_protocol("observer", observer_protocol),