{"action":"created","comment":{"url":"https://api.github.com/repos/stlab/libraries/pulls/comments/71092830","id":71092830,"diff_hunk":"@@ -900,327 +933,261 @@ auto when_all(S s, F f, future<Ts>... args) {\n namespace detail\n {\n     template <typename R>\n-    struct context_apply_result {\n-        using result_type = std::vector<R>;\n-\n-        explicit context_apply_result(size_t size) : _results(size) {}\n-\n+    struct value_storer\n+    {\n         template <typename C, typename F>\n-        void apply_result(C& c, F& f, size_t index) {\n-            c._results[index] = std::move(*f.get_try());\n+        static void store(C& c, F&& f, size_t index)\n+        {\n+            c._results = std::move(*std::forward<F>(f).get_try());\n+            c._index = index;\n         }\n-\n-        std::vector<R>  _results;\n     };\n \n-    struct context_apply_void {\n-        using result_type = void;\n-\n-        explicit context_apply_void(size_t) {}\n-\n+    template <typename T>\n+    struct value_storer<std::vector<T>>\n+    {\n         template <typename C, typename F>\n-        void apply_result(C&, F&, size_t) {\n+        static void store(C& c, F&& f, size_t index)\n+        {\n+            c._results[index] = std::move(*std::forward<F>(f).get_try());\n         }\n     };\n \n-    template <typename ApplyPolicy, typename F, typename I, typename R>\n-    struct when_all_range_context : ApplyPolicy {\n-        when_all_range_context(I first, I last)\n-            : ApplyPolicy(std::distance(first, last))\n-            , _remaining(std::distance(first, last))\n-            , _holds(_remaining)\n-        {}\n-\n-        std::atomic_size_t                    _remaining;\n-        std::atomic_bool                      _error_happened{ false };\n-        std::vector<future<void>>             _holds;\n-        std::mutex                            _errormutex;\n-        boost::optional<std::exception_ptr>   _error;\n-        packaged_task<>                       _f;\n-\n-        void done() { if (--_remaining == 0 && !_error_happened) _f(); }\n+    template <bool Indxed, typename R>\n+    struct result_creator;\n \n-        void failure(std::exception_ptr error) {\n-            {\n-                std::unique_lock<std::mutex> lock(_errormutex);\n-                _error = std::move(error);\n-                _error_happened = true;\n-            }\n-            for (auto& h : _holds) {\n-                h.cancel_try();\n-            }\n-            _f();\n-        }\n+    template <>\n+    struct result_creator<true, void>\n+    {\n+        template <typename C>\n+        static auto go(C& context) { return context._f(context._index); }\n     };\n \n-    template <typename P, typename T>\n-    void attach_when_all_range_tasks(size_t index, const std::shared_ptr<P>& p, T a) {\n-        p->_holds[index] = std::move(a).recover([_w = std::weak_ptr<P>(p), _i = index](auto x){\n-            auto p = _w.lock(); if (!p) return;\n-            auto error = x.error();\n-            if (error) {\n-                p->failure(*error);\n-            }\n-            else {\n-                p->apply_result(*p ,x, _i);\n-                p->done();\n-            }\n-        });\n-    }\n+    template <>\n+    struct result_creator<false, void>\n+    {\n+        template <typename C>\n+        static auto go(C& context) { return context._f(); }\n+    };\n+    \n+    template <typename R>\n+    struct result_creator<true, R>\n+    {\n+        template <typename C>\n+        static auto go(C& context) { return context._f(context._results, context._index); }\n+    };\n \n     template <typename R>\n-    struct create_when_all_range_future {\n+    struct result_creator<false, R>\n+    {\n+        template <typename C>\n+        static auto go(C& context) { return context._f(context._results); }\n+    };\n \n-        template<typename S, typename F, typename I>\n-        static auto do_it(S&& s, F&& f, I first, I last) {\n-            using result_t = typename std::result_of<F(const std::vector<R>&)>::type;\n-            using context_t = detail::when_all_range_context<context_apply_result<R>, F, I, R >;\n \n-            if (first == last) {\n-                auto p = package<result_t()>(std::forward<S>(s), std::bind(std::forward<F>(f), std::vector<R>()));\n-                s(std::move(p.first));\n-                return std::move(p.second);\n-            }\n \n-            auto context = std::make_shared<context_t>(first, last);\n-            auto p = package<result_t()>(std::move(s), [_f = std::move(f), _c = context] {\n-                if (_c->_error) {\n-                    std::rethrow_exception(_c->_error.get());\n-                }\n-                return _f(_c->_results);\n-            });\n+    template<typename F, bool Indexed, typename R>\n+    struct context_result\n+    {\n+        using result_type = R;\n \n-            context->_f = std::move(p.first);\n+        R       _results;\n+        size_t  _index;\n+        F       _f;\n \n-            size_t index(0);\n-            std::for_each(first, last, [&index, &context](auto item) {\n-                detail::attach_when_all_range_tasks(index++, context, item);\n-            });\n+        context_result(F f, size_t s)\n+            : _f(std::move(f))\n+        {\n+            init(_results, s);\n+        }\n \n-            return std::move(p.second);\n+        template <typename T>\n+        void init(std::vector<T>& v, size_t s) {\n+            v.resize(s);\n         }\n-    };\n \n-    template <>\n-    struct create_when_all_range_future<void> {\n+        template <typename T>\n+        void init(T&, size_t) {}\n \n-        template<typename S, typename F, typename I>\n-        static auto do_it(S&& s, F&& f, I first, I last) {\n-            using result_t = typename std::result_of<F()>::type;\n-            using context_t = detail::when_all_range_context<context_apply_void, F, I, void>;\n+        template <typename FF>\n+        void apply(FF&& f, size_t index) {\n+            value_storer<R>::store(*this, std::forward<FF>(f), index);\n+        }\n \n-            if (first == last) {\n-                auto p = package<void()>(std::forward<S>(s), std::forward<F>(f));\n-                s(std::move(p.first));\n-                return std::move(p.second);\n-            }\n+        auto operator()() {\n+            return result_creator<Indexed,R>::go(*this);\n+        }\n+    };\n \n-            auto context = std::make_shared<context_t>(first, last);\n-            auto p = package<result_t()>(std::move(s), [_f = std::move(f), _c = context]{\n-                if (_c->_error) {\n-                    std::rethrow_exception(_c->_error.get());\n-                }\n-                return _f();\n-            });\n+    template<typename F, bool Indexed>\n+    struct context_result<F, Indexed, void>\n+    {\n+        size_t  _index;\n+        F       _f;\n \n-            context->_f = std::move(p.first);\n+        context_result(F f, size_t)\n+            : _f(std::move(f))\n+        {}\n \n-            size_t index(0);\n-            std::for_each(first, last, [&index, &context](auto item) {\n-                detail::attach_when_all_range_tasks(index++, context, item);\n-            });\n+        template <typename FF>\n+        void apply(FF&& f, size_t index) {\n+            _index = index;\n+        }\n \n-            return std::move(p.second);\n+        auto operator()() {\n+            return result_creator<Indexed, void>::go(*this);\n         }\n     };\n \n     /**************************************************************************************************/\n-    template <typename F, typename I>\n-    struct when_any_range_context_base {\n-        when_any_range_context_base(I first, I last)\n-            : _remaining(std::distance(first, last))\n-            , _holds(_remaining)\n-        {}\n \n-        std::atomic_size_t                    _remaining{0};\n+    template <typename CR, typename F>\n+    struct when_range_context_base : CR\n+    {\n+        std::atomic_size_t                    _remaining;\n+        std::atomic_bool                      _error_happened{ false };\n         std::vector<future<void>>             _holds;\n-        std::mutex                            _mutex;\n         boost::optional<std::exception_ptr>   _error;\n-        size_t                                _index{0};\n         packaged_task<>                       _f;\n \n-        void failure(std::exception_ptr error) {\n-            // we already have a result\n-            if (_remaining == 0) {\n-                return;\n-            }\n-            // only the last error is of any interest\n-            if (_remaining == 1) {\n-                _error = std::move(error);\n-                _f();\n+        when_range_context_base(F f, size_t s)\n+            : CR(std::move(f), s)\n+            , _remaining(s)\n+            , _holds(_remaining)\n+        {}\n+\n+        auto execute() {\n+            if (this->_error) {\n+                std::rethrow_exception(this->_error.get());\n             }\n-            --_remaining;\n+            return CR::operator()();\n         }\n     };\n \n-    template <typename F, typename I, typename Input>\n-    struct when_any_range_context : when_any_range_context_base<F, I> {\n-        when_any_range_context(I first, I last)\n-            : when_any_range_context_base<F, I>(first, last)\n+\n+    template <typename CR, typename F>\n+    struct when_all_range_context : when_range_context_base<CR, F>\n+    {\n+        when_all_range_context(F f, size_t s)\n+            : when_range_context_base<CR, F>(std::move(f), s)\n         {}\n-        \n-        void done(Input r, size_t index) {\n-            if (when_any_range_context_base<F,I>::_remaining == 0)\n+\n+        template<typename FF>\n+        void done(FF&& f, size_t index) {\n+            this->apply(std::forward<FF>(f), index);\n+            if (--this->_remaining == 0) this->_f();\n+        }\n+\n+        void failure(std::exception_ptr error, size_t) {\n+            bool current_error_happened = this->_error_happened.load();\n+            if (current_error_happened)\n                 return;\n-            {\n-                std::unique_lock<std::mutex> lock(when_any_range_context_base<F, I>::_mutex);\n-                if (when_any_range_context_base<F, I>::_remaining != 0) {\n-                    when_any_range_context_base<F, I>::_remaining = 0;\n-                    _result = std::move(r);\n-                    when_any_range_context_base<F, I>::_index = index;\n-                    for (auto& h : this->_holds) {\n-                        h.cancel_try();\n-                    }\n-                }\n-                else {\n-                    return;\n-                }\n+\n+            if (this->_error_happened.compare_exchange_strong(current_error_happened, true)) {","path":"stlab/future.hpp","position":380,"original_position":380,"commit_id":"9b8bff2b159957ff03117543a7c5cd0e3c94e23e","original_commit_id":"9b8bff2b159957ff03117543a7c5cd0e3c94e23e","user":{"login":"sean-parent","id":2279724,"avatar_url":"https://avatars.githubusercontent.com/u/2279724?v=3","gravatar_id":"","url":"https://api.github.com/users/sean-parent","html_url":"https://github.com/sean-parent","followers_url":"https://api.github.com/users/sean-parent/followers","following_url":"https://api.github.com/users/sean-parent/following{/other_user}","gists_url":"https://api.github.com/users/sean-parent/gists{/gist_id}","starred_url":"https://api.github.com/users/sean-parent/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sean-parent/subscriptions","organizations_url":"https://api.github.com/users/sean-parent/orgs","repos_url":"https://api.github.com/users/sean-parent/repos","events_url":"https://api.github.com/users/sean-parent/events{/privacy}","received_events_url":"https://api.github.com/users/sean-parent/received_events","type":"User","site_admin":false},"body":"Same comment as above - just expect false here, the additional load doesn't help.","created_at":"2016-07-18T00:11:43Z","updated_at":"2016-07-18T00:11:43Z","html_url":"https://github.com/stlab/libraries/pull/9#discussion_r71092830","pull_request_url":"https://api.github.com/repos/stlab/libraries/pulls/9","_links":{"self":{"href":"https://api.github.com/repos/stlab/libraries/pulls/comments/71092830"},"html":{"href":"https://github.com/stlab/libraries/pull/9#discussion_r71092830"},"pull_request":{"href":"https://api.github.com/repos/stlab/libraries/pulls/9"}}},"pull_request":{"url":"https://api.github.com/repos/stlab/libraries/pulls/9","id":75718464,"html_url":"https://github.com/stlab/libraries/pull/9","diff_url":"https://github.com/stlab/libraries/pull/9.diff","patch_url":"https://github.com/stlab/libraries/pull/9.patch","issue_url":"https://api.github.com/repos/stlab/libraries/issues/9","number":9,"state":"open","locked":false,"title":"Fixing race condition found by JDurkan.","user":{"login":"FelixPetriconi","id":612377,"avatar_url":"https://avatars.githubusercontent.com/u/612377?v=3","gravatar_id":"","url":"https://api.github.com/users/FelixPetriconi","html_url":"https://github.com/FelixPetriconi","followers_url":"https://api.github.com/users/FelixPetriconi/followers","following_url":"https://api.github.com/users/FelixPetriconi/following{/other_user}","gists_url":"https://api.github.com/users/FelixPetriconi/gists{/gist_id}","starred_url":"https://api.github.com/users/FelixPetriconi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/FelixPetriconi/subscriptions","organizations_url":"https://api.github.com/users/FelixPetriconi/orgs","repos_url":"https://api.github.com/users/FelixPetriconi/repos","events_url":"https://api.github.com/users/FelixPetriconi/events{/privacy}","received_events_url":"https://api.github.com/users/FelixPetriconi/received_events","type":"User","site_admin":false},"body":"In this PR three race conditions are fixed. Temporarily the cancel_try() calls are disabled, because they are so far not thread safe.","created_at":"2016-06-29T20:46:43Z","updated_at":"2016-07-18T00:11:43Z","closed_at":null,"merged_at":null,"merge_commit_sha":"8a1e2f4184f1e687c25b73fdb327bff5937228af","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/stlab/libraries/pulls/9/commits","review_comments_url":"https://api.github.com/repos/stlab/libraries/pulls/9/comments","review_comment_url":"https://api.github.com/repos/stlab/libraries/pulls/comments{/number}","comments_url":"https://api.github.com/repos/stlab/libraries/issues/9/comments","statuses_url":"https://api.github.com/repos/stlab/libraries/statuses/9b8bff2b159957ff03117543a7c5cd0e3c94e23e","head":{"label":"FelixPetriconi:FutureFix","ref":"FutureFix","sha":"9b8bff2b159957ff03117543a7c5cd0e3c94e23e","user":{"login":"FelixPetriconi","id":612377,"avatar_url":"https://avatars.githubusercontent.com/u/612377?v=3","gravatar_id":"","url":"https://api.github.com/users/FelixPetriconi","html_url":"https://github.com/FelixPetriconi","followers_url":"https://api.github.com/users/FelixPetriconi/followers","following_url":"https://api.github.com/users/FelixPetriconi/following{/other_user}","gists_url":"https://api.github.com/users/FelixPetriconi/gists{/gist_id}","starred_url":"https://api.github.com/users/FelixPetriconi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/FelixPetriconi/subscriptions","organizations_url":"https://api.github.com/users/FelixPetriconi/orgs","repos_url":"https://api.github.com/users/FelixPetriconi/repos","events_url":"https://api.github.com/users/FelixPetriconi/events{/privacy}","received_events_url":"https://api.github.com/users/FelixPetriconi/received_events","type":"User","site_admin":false},"repo":{"id":51784606,"name":"libraries","full_name":"FelixPetriconi/libraries","owner":{"login":"FelixPetriconi","id":612377,"avatar_url":"https://avatars.githubusercontent.com/u/612377?v=3","gravatar_id":"","url":"https://api.github.com/users/FelixPetriconi","html_url":"https://github.com/FelixPetriconi","followers_url":"https://api.github.com/users/FelixPetriconi/followers","following_url":"https://api.github.com/users/FelixPetriconi/following{/other_user}","gists_url":"https://api.github.com/users/FelixPetriconi/gists{/gist_id}","starred_url":"https://api.github.com/users/FelixPetriconi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/FelixPetriconi/subscriptions","organizations_url":"https://api.github.com/users/FelixPetriconi/orgs","repos_url":"https://api.github.com/users/FelixPetriconi/repos","events_url":"https://api.github.com/users/FelixPetriconi/events{/privacy}","received_events_url":"https://api.github.com/users/FelixPetriconi/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/FelixPetriconi/libraries","description":"ASL libraries will be migrated here in the stlab namespace, new libraries will be created here.","fork":true,"url":"https://api.github.com/repos/FelixPetriconi/libraries","forks_url":"https://api.github.com/repos/FelixPetriconi/libraries/forks","keys_url":"https://api.github.com/repos/FelixPetriconi/libraries/keys{/key_id}","collaborators_url":"https://api.github.com/repos/FelixPetriconi/libraries/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/FelixPetriconi/libraries/teams","hooks_url":"https://api.github.com/repos/FelixPetriconi/libraries/hooks","issue_events_url":"https://api.github.com/repos/FelixPetriconi/libraries/issues/events{/number}","events_url":"https://api.github.com/repos/FelixPetriconi/libraries/events","assignees_url":"https://api.github.com/repos/FelixPetriconi/libraries/assignees{/user}","branches_url":"https://api.github.com/repos/FelixPetriconi/libraries/branches{/branch}","tags_url":"https://api.github.com/repos/FelixPetriconi/libraries/tags","blobs_url":"https://api.github.com/repos/FelixPetriconi/libraries/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/FelixPetriconi/libraries/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/FelixPetriconi/libraries/git/refs{/sha}","trees_url":"https://api.github.com/repos/FelixPetriconi/libraries/git/trees{/sha}","statuses_url":"https://api.github.com/repos/FelixPetriconi/libraries/statuses/{sha}","languages_url":"https://api.github.com/repos/FelixPetriconi/libraries/languages","stargazers_url":"https://api.github.com/repos/FelixPetriconi/libraries/stargazers","contributors_url":"https://api.github.com/repos/FelixPetriconi/libraries/contributors","subscribers_url":"https://api.github.com/repos/FelixPetriconi/libraries/subscribers","subscription_url":"https://api.github.com/repos/FelixPetriconi/libraries/subscription","commits_url":"https://api.github.com/repos/FelixPetriconi/libraries/commits{/sha}","git_commits_url":"https://api.github.com/repos/FelixPetriconi/libraries/git/commits{/sha}","comments_url":"https://api.github.com/repos/FelixPetriconi/libraries/comments{/number}","issue_comment_url":"https://api.github.com/repos/FelixPetriconi/libraries/issues/comments{/number}","contents_url":"https://api.github.com/repos/FelixPetriconi/libraries/contents/{+path}","compare_url":"https://api.github.com/repos/FelixPetriconi/libraries/compare/{base}...{head}","merges_url":"https://api.github.com/repos/FelixPetriconi/libraries/merges","archive_url":"https://api.github.com/repos/FelixPetriconi/libraries/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/FelixPetriconi/libraries/downloads","issues_url":"https://api.github.com/repos/FelixPetriconi/libraries/issues{/number}","pulls_url":"https://api.github.com/repos/FelixPetriconi/libraries/pulls{/number}","milestones_url":"https://api.github.com/repos/FelixPetriconi/libraries/milestones{/number}","notifications_url":"https://api.github.com/repos/FelixPetriconi/libraries/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/FelixPetriconi/libraries/labels{/name}","releases_url":"https://api.github.com/repos/FelixPetriconi/libraries/releases{/id}","deployments_url":"https://api.github.com/repos/FelixPetriconi/libraries/deployments","created_at":"2016-02-15T20:48:39Z","updated_at":"2016-02-15T20:48:39Z","pushed_at":"2016-07-15T19:02:04Z","git_url":"git://github.com/FelixPetriconi/libraries.git","ssh_url":"git@github.com:FelixPetriconi/libraries.git","clone_url":"https://github.com/FelixPetriconi/libraries.git","svn_url":"https://github.com/FelixPetriconi/libraries","homepage":null,"size":198,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"develop"}},"base":{"label":"stlab:develop","ref":"develop","sha":"f3d8ed041a5784d763ca5eec1834a60753d13f72","user":{"login":"stlab","id":2448845,"avatar_url":"https://avatars.githubusercontent.com/u/2448845?v=3","gravatar_id":"","url":"https://api.github.com/users/stlab","html_url":"https://github.com/stlab","followers_url":"https://api.github.com/users/stlab/followers","following_url":"https://api.github.com/users/stlab/following{/other_user}","gists_url":"https://api.github.com/users/stlab/gists{/gist_id}","starred_url":"https://api.github.com/users/stlab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stlab/subscriptions","organizations_url":"https://api.github.com/users/stlab/orgs","repos_url":"https://api.github.com/users/stlab/repos","events_url":"https://api.github.com/users/stlab/events{/privacy}","received_events_url":"https://api.github.com/users/stlab/received_events","type":"Organization","site_admin":false},"repo":{"id":35681376,"name":"libraries","full_name":"stlab/libraries","owner":{"login":"stlab","id":2448845,"avatar_url":"https://avatars.githubusercontent.com/u/2448845?v=3","gravatar_id":"","url":"https://api.github.com/users/stlab","html_url":"https://github.com/stlab","followers_url":"https://api.github.com/users/stlab/followers","following_url":"https://api.github.com/users/stlab/following{/other_user}","gists_url":"https://api.github.com/users/stlab/gists{/gist_id}","starred_url":"https://api.github.com/users/stlab/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/stlab/subscriptions","organizations_url":"https://api.github.com/users/stlab/orgs","repos_url":"https://api.github.com/users/stlab/repos","events_url":"https://api.github.com/users/stlab/events{/privacy}","received_events_url":"https://api.github.com/users/stlab/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/stlab/libraries","description":"ASL libraries will be migrated here in the stlab namespace, new libraries will be created here.","fork":false,"url":"https://api.github.com/repos/stlab/libraries","forks_url":"https://api.github.com/repos/stlab/libraries/forks","keys_url":"https://api.github.com/repos/stlab/libraries/keys{/key_id}","collaborators_url":"https://api.github.com/repos/stlab/libraries/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/stlab/libraries/teams","hooks_url":"https://api.github.com/repos/stlab/libraries/hooks","issue_events_url":"https://api.github.com/repos/stlab/libraries/issues/events{/number}","events_url":"https://api.github.com/repos/stlab/libraries/events","assignees_url":"https://api.github.com/repos/stlab/libraries/assignees{/user}","branches_url":"https://api.github.com/repos/stlab/libraries/branches{/branch}","tags_url":"https://api.github.com/repos/stlab/libraries/tags","blobs_url":"https://api.github.com/repos/stlab/libraries/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/stlab/libraries/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/stlab/libraries/git/refs{/sha}","trees_url":"https://api.github.com/repos/stlab/libraries/git/trees{/sha}","statuses_url":"https://api.github.com/repos/stlab/libraries/statuses/{sha}","languages_url":"https://api.github.com/repos/stlab/libraries/languages","stargazers_url":"https://api.github.com/repos/stlab/libraries/stargazers","contributors_url":"https://api.github.com/repos/stlab/libraries/contributors","subscribers_url":"https://api.github.com/repos/stlab/libraries/subscribers","subscription_url":"https://api.github.com/repos/stlab/libraries/subscription","commits_url":"https://api.github.com/repos/stlab/libraries/commits{/sha}","git_commits_url":"https://api.github.com/repos/stlab/libraries/git/commits{/sha}","comments_url":"https://api.github.com/repos/stlab/libraries/comments{/number}","issue_comment_url":"https://api.github.com/repos/stlab/libraries/issues/comments{/number}","contents_url":"https://api.github.com/repos/stlab/libraries/contents/{+path}","compare_url":"https://api.github.com/repos/stlab/libraries/compare/{base}...{head}","merges_url":"https://api.github.com/repos/stlab/libraries/merges","archive_url":"https://api.github.com/repos/stlab/libraries/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/stlab/libraries/downloads","issues_url":"https://api.github.com/repos/stlab/libraries/issues{/number}","pulls_url":"https://api.github.com/repos/stlab/libraries/pulls{/number}","milestones_url":"https://api.github.com/repos/stlab/libraries/milestones{/number}","notifications_url":"https://api.github.com/repos/stlab/libraries/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/stlab/libraries/labels{/name}","releases_url":"https://api.github.com/repos/stlab/libraries/releases{/id}","deployments_url":"https://api.github.com/repos/stlab/libraries/deployments","created_at":"2015-05-15T15:25:09Z","updated_at":"2016-06-14T17:13:15Z","pushed_at":"2016-07-18T00:02:57Z","git_url":"git://github.com/stlab/libraries.git","ssh_url":"git@github.com:stlab/libraries.git","clone_url":"https://github.com/stlab/libraries.git","svn_url":"https://github.com/stlab/libraries","homepage":null,"size":183,"stargazers_count":54,"watchers_count":54,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":5,"mirror_url":null,"open_issues_count":3,"forks":5,"open_issues":3,"watchers":54,"default_branch":"develop"}},"_links":{"self":{"href":"https://api.github.com/repos/stlab/libraries/pulls/9"},"html":{"href":"https://github.com/stlab/libraries/pull/9"},"issue":{"href":"https://api.github.com/repos/stlab/libraries/issues/9"},"comments":{"href":"https://api.github.com/repos/stlab/libraries/issues/9/comments"},"review_comments":{"href":"https://api.github.com/repos/stlab/libraries/pulls/9/comments"},"review_comment":{"href":"https://api.github.com/repos/stlab/libraries/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/stlab/libraries/pulls/9/commits"},"statuses":{"href":"https://api.github.com/repos/stlab/libraries/statuses/9b8bff2b159957ff03117543a7c5cd0e3c94e23e"}}}}
{"actor":{"display_login":"sean-parent"}}