{"action":"created","comment":{"url":"https://api.github.com/repos/arcosuc3m/grppi/pulls/comments/127295447","pull_request_review_id":49866296,"id":127295447,"diff_hunk":"@@ -21,398 +21,514 @@\n #ifndef GRPPI_NATIVE_PIPELINE_H\n #define GRPPI_NATIVE_PIPELINE_H\n \n+#include \"common/pack_traits.h\"\n+\n #include <experimental/optional>\n \n #include <thread>\n \n \n namespace grppi{\n \n-template <typename InStream, typename OutStream, int currentStage, typename ...Stages>\n- typename std::enable_if<(currentStage == (sizeof...(Stages)-1)), void>::type composed_pipeline(InStream& qin, pipeline_info<parallel_execution_native, Stages...> const & pipe, OutStream &qout,std::vector<std::thread> & tasks)\n+template <typename InQueue, typename OutQueue, int Index, \n+          typename ... MoreTransformers,\n+          internal::requires_index_last<Index,MoreTransformers...> = 0>\n+void composed_pipeline(InQueue & input_queue, \n+                       const pipeline_info<parallel_execution_native, MoreTransformers...> & pipe, \n+                       OutQueue & output_queue, std::vector<std::thread> & tasks)\n {\n-      composed_pipeline(pipe.exectype, qin, std::get<currentStage>(pipe.stages), qout, tasks);\n+  composed_pipeline(pipe.exectype, input_queue, \n+      std::get<Index>(pipe.stages), output_queue, tasks);\n }\n \n \n-template <typename InStream, typename OutStream, int currentStage, typename ...Stages>\n- typename std::enable_if<(currentStage < (sizeof...(Stages)-1)), void>::type composed_pipeline(InStream& qin, pipeline_info<parallel_execution_native, Stages...> const & pipe, OutStream & qout,std::vector<std::thread> & tasks)\n+template <typename InQueue, typename OutQueue, int Index, \n+          typename ... MoreTransformers,\n+          internal::requires_index_not_last<Index,MoreTransformers...> = 0>\n+void composed_pipeline(InQueue & input_queue, \n+                       const pipeline_info<parallel_execution_native,MoreTransformers...> & pipeline_obj, \n+                       OutQueue & output_queue, std::vector<std::thread> & tasks)\n {\n-      typedef typename std::tuple_element<currentStage, decltype(pipe.stages)>::type lambdaType;\n-//      typedef typename std::remove_reference<decltype(lambdaPointerType())>::type  lambdaType; \n-      typedef typename std::result_of< lambdaType (typename InStream::value_type::value_type) > ::type queueType;\n-\n-\n-\n-      static mpmc_queue<std::experimental::optional<queueType>> queueOut(pipe.exectype.queue_size,pipe.exectype.lockfree); \n-\n-      composed_pipeline(pipe.exectype, qin, std::get<currentStage>(pipe.stages), queueOut, tasks);\n-      composed_pipeline<mpmc_queue<std::experimental::optional<queueType>>,OutStream, currentStage+1, Stages ...>(queueOut,pipe,qout,tasks);\n-       \n+  using stage_type = \n+      typename std::tuple_element<Index,decltype(pipeline_obj.stages)>::type;\n+  using input_type = typename InQueue::value_type;\n+  using input_value_type = typename input_type::value_type;\n+  using result_type = \n+      typename std::result_of<stage_type(input_type)>::type;\n+\n+  // TODO: Why static?\n+  static mpmc_queue<std::experimental::optional<result_type>> tmp_queue{\n+      pipeline_obj.exectype.queue_size, pipeline_obj.exectype.lockfree}; \n+\n+  composed_pipeline(pipeline_obj.exectype, input_queue, \n+      std::get<Index>(pipeline_obj.stages), tmp_queue, tasks);\n+  composed_pipeline<mpmc_queue<std::experimental::optional<result_type>>, \n+      OutQueue, Index+1, MoreTransformers ...>(\n+          tmp_queue,pipeline_obj,output_queue,tasks);\n }\n \n-template <typename InStream, typename Stage, typename OutStream>\n- void composed_pipeline(parallel_execution_native &p, InStream &qin, Stage const & s, OutStream &qout, std::vector<std::thread> & tasks){\n-    tasks.push_back(\n-      std::thread([&](){\n-        using lambdaType = Stage;\n-        p.register_thread();\n+template <typename InQueue, typename Transformer, typename OutQueue>\n+void composed_pipeline(parallel_execution_native & ex, InQueue & input_queue,\n+                       Transformer && transform_op, OutQueue & output_queue, \n+                       std::vector<std::thread> & tasks)\n+{\n+  using namespace std;\n+  tasks.push_back(\n+    thread{[&](){\n+      ex.register_thread();\n         \n-        auto item = qin.pop();\n-        while(true){\n-           if(!item) {\n-                qout.push( typename OutStream::value_type::value_type () );\n-                break;\n-           }else{\n-                auto out = typename OutStream::value_type::value_type( (*s)(item.value()) );\n-                qout.push(out);\n-           }\n-           item = qin.pop();\n+      auto item = input_queue.pop();\n+      for (;;) {\n+        using output_type = typename OutQueue::value_type;\n+        using output_value_type = typename output_type::value_type;\n+        if (!item) {\n+          output_queue.push(output_value_type{}); \n+          break;\n         }\n-\n-        p.deregister_thread();\n+        else {\n+          auto out = output_value_type{transform_op(item.value())};\n+          output_queue.push(out);\n+        }\n+        item = input_queue.pop();\n       }\n-    ));\n+\n+      ex.deregister_thread();\n+    }}\n+  );\n }\n \n //Last stage\n-template <typename Stream, typename Stage>\n- void stages( parallel_execution_native & p,Stream& st, Stage && s ) {\n-\n-   p.register_thread();\n-\n-   typename Stream::value_type item;\n-   std::vector<typename Stream::value_type> elements;\n-   long current = 0;\n-   if(p.ordering){\n-     item = st.pop( );\n-     while( item.first ) {\n-        if(current == item.second){\n-           s( item.first.value() );\n-           current ++;\n-        }else{\n-           elements.push_back(item);\n-        }\n-        for(auto it = elements.begin(); it != elements.end(); it++){\n-           if((*it).second == current) {\n-              s((*it).first.value());\n-              elements.erase(it);\n-              current++;\n-              break;\n-           }\n+template <typename InQueue, typename Consumer>\n+void pipeline_impl(parallel_execution_native & ex, InQueue& input_queue, \n+                   Consumer && consume) \n+{\n+  using namespace std;\n+  using input_type = typename InQueue::value_type;\n+\n+  ex.register_thread();\n+\n+  vector<input_type> elements;\n+  long current = 0;\n+  if (ex.ordering){\n+    auto item = input_queue.pop();\n+    while (item.first) {\n+      if(current == item.second){\n+        consume(item.first.value());\n+        current ++;\n+      }\n+      else {\n+        elements.push_back(item);\n+      }\n+      // TODO: Probably find_if() + erase \n+      for (auto it=elements.begin(); it!=elements.end(); it++) {\n+        if(it->second == current) {\n+          consume(it->first.value());\n+          elements.erase(it);\n+          current++;\n+          break;\n         }\n-       item = st.pop( );\n-     }\n-     while(elements.size()>0){\n-        for(auto it = elements.begin(); it != elements.end(); it++){\n-          if((*it).second == current) {\n-            s((*it).first.value());\n-            elements.erase(it);\n-            current++;\n-            break;\n-          }\n+      }\n+      item = input_queue.pop( );\n+    }\n+    while (elements.size()>0) {\n+      // TODO: Probably find_if() + erase\n+      for (auto it = elements.begin(); it != elements.end(); it++) {\n+        if(it->second == current) {\n+          consume(it->first.value());\n+          elements.erase(it);\n+          current++;\n+          break;\n         }\n       }\n-   }else{\n-      item = st.pop( );\n-      while( item.first ) {\n-        s( item.first.value() );\n-        item = st.pop( );\n-     }\n-   }\n+    }\n+  }\n+  else {\n+    auto item = input_queue.pop( );\n+    while (item.first) {\n+      consume(item.first.value());\n+      item = input_queue.pop();\n+    }\n+  }\n   \n-   p.deregister_thread();\n-\n+  ex.deregister_thread();\n }\n \n-//Stream reduce stage\n-template <typename Operation, typename Red, typename Stream>\n-void stages(parallel_execution_native & p, Stream & st,\n-reduction_info<parallel_execution_native, Operation, Red> & se) {\n-    stages(p, st,std::forward<reduction_info<parallel_execution_native, Operation, Red> &&>( se) );\n+//Item reduce stage\n+template <typename Transformer, typename Reducer, typename InQueue>\n+void pipeline_impl(parallel_execution_native & ex, InQueue & input_queue,\n+                   reduction_info<parallel_execution_native, Transformer, Reducer> & reduction_obj) \n+{\n+  using reduction_type = \n+      reduction_info<parallel_execution_native,Transformer,Reducer>;\n+\n+  pipeline_impl(ex, input_queue, std::forward<reduction_type>(reduction_obj));\n }\n \n \n \n-template <typename Operation, typename Red, typename Stream>\n-void stages(parallel_execution_native & p, Stream & st,\n-reduction_info<parallel_execution_native, Operation, Red> && se) {\n-    std::vector<std::thread> tasks;\n-    mpmc_queue<typename std::result_of<Operation(typename Stream::value_type) >::type > queueOut(p.queue_size,p.lockfree);\n-\n-    for( int th = 0; th < se.exectype.num_threads; th++){\n-        tasks.push_back(\n-           std::thread([&](){\n-              typename Stream::value_type item;\n-              item = st.pop( );\n-              while( item ) {\n-                 auto local =  se.task(item) ;\n-                 queueOut.push( local ) ;\n-                 item = st.pop( );\n-              }\n-              typename std::result_of<Operation(typename Stream::value_type) >::type out;\n-              queueOut.push( out ) ;\n-       }));\n-    }\n-    //stages(p, q, sgs ... );\n-    for(int i=0;i<tasks.size(); i++) tasks[i].join();\n+template <typename Transformer, typename Reducer, typename InQueue>\n+void pipeline_impl(parallel_execution_native & ex, InQueue & input_queue,\n+                   reduction_info<parallel_execution_native,Transformer,Reducer> && reduction_obj) \n+{\n+  using namespace std;\n+  vector<thread> tasks;\n+  using input_type = typename InQueue::value_type;\n+  using result_type = typename result_of<Transformer(input_type)>::type;\n+  mpmc_queue<result_type> output_queue{ex.queue_size,ex.lockfree};\n+\n+  for (int th=0; th<reduction_obj.exectype.num_threads; th++) {\n+    tasks.push_back(\n+      thread{[&](){\n+        auto item = input_queue.pop( );\n+        while (item) {\n+          auto local =  input_queue.task(item) ;\n+          output_queue.push( local ) ;\n+          item = input_queue.pop( );\n+        }\n+        output_queue.push(result_type{}) ;\n+      }}\n+    );\n+  }\n+  // TODO: Remove commented line?\n+  //pipeline_impl(p, q, sgs ... );\n+\n+  for (auto && t : tasks) { t.join(); }\n }\n \n //Filtering stage\n-template <typename Operation, typename Stream, typename... Stages>\n-void stages(parallel_execution_native &p, Stream& st,\n-            filter_info<parallel_execution_native,Operation> & se, Stages && ... sgs ) {\n-     stages(p,st,std::forward<filter_info<parallel_execution_native,Operation> &&>( se ), std::forward<Stages>( sgs )... );\n+template <typename Transformer, typename InQueue, typename... MoreTransformers>\n+void pipeline_impl(parallel_execution_native & ex, InQueue & input_queue,\n+                   filter_info<parallel_execution_native,Transformer> & filter_obj, \n+                   MoreTransformers && ... more_transform_ops) \n+{\n+  using filter_type = filter_info<parallel_execution_native,Transformer>;\n \n+  pipeline_impl(ex,input_queue, std::forward<filter_type>(filter_obj), \n+    std::forward<MoreTransformers>(more_transform_ops)... );\n }\n \n+template <typename Transformer, typename InQueue, typename... MoreTransformers>\n+void pipeline_impl_ordered(parallel_execution_native & ex, InQueue& input_queue,\n+                           filter_info<parallel_execution_native,Transformer> && filter_obj, \n+                           MoreTransformers && ... more_transform_ops ) \n+{\n+  using namespace std;\n+  vector<thread> tasks;\n \n+  using input_type = typename InQueue::value_type;\n+  using input_value_type = typename input_type::first_type;\n+  mpmc_queue<input_type> tmp_queue{ex.queue_size, ex.lockfree};\n \n-template <typename Operation, typename Stream, typename... Stages>\n-void stages(parallel_execution_native &p, Stream& st,\n-            filter_info<parallel_execution_native,Operation> && se, Stages && ... sgs ) {\n-    \n-    std::vector<std::thread> tasks;\n-    if(p.ordering){\n-       mpmc_queue< typename Stream::value_type > q(p.queue_size,p.lockfree);\n-\n-       std::atomic<int> nend ( 0 );\n-       for( int th = 0; th < se.exectype.num_threads; th++){\n-          tasks.push_back(\n-              std::thread([&](){\n-                 //Register the thread in the execution model\n-                 se.exectype.register_thread();\n-                 typename Stream::value_type item;\n-                 item = st.pop( ) ;\n-                 while( item.first ) {\n-                  //MODIFIED from *se->task\n-                     if( se.task(item.first.value()) )\n-                        q.push( item );\n-                     else{\n-                        q.push( std::make_pair( typename Stream::value_type::first_type()  ,item.second) );\n-                     } \n-                     item = st.pop();\n-                 }\n-                 nend++;\n-                 if(nend == se.exectype.num_threads){\n-                    q.push( std::make_pair(typename Stream::value_type::first_type(), -1) );\n-                 }else{\n-                    st.push(item);\n-                 }\n-                 //MODIFIED from se->exectype.deregister_thread();\n-                 //Deregister the thread in the execution model\n-                 se.exectype.deregister_thread();\n-\n-          }));\n-       } \n-       mpmc_queue< typename Stream::value_type > qOut(p.queue_size,p.lockfree);\n-       auto orderingthr = std::thread([&](){\n-          p.register_thread();\n-          typename Stream::value_type item;\n-          std::vector<typename Stream::value_type> elements;\n-          int current = 0;\n-          long order = 0;\n-          item = q.pop( ) ;\n-          while(1){\n-             if(!item.first && item.second == -1){ \n-                 break; \n-             }\n-             if(item.second == current){\n-                if(item.first){\n-                   qOut.push(std::make_pair(item.first,order));\n-                   order++;\n-                }\n-                current++;\n-             }else{\n-                elements.push_back(item);\n-             }\n-             for(auto it = elements.begin(); it < elements.end(); it++){\n-                if((*it).second == current){\n-                    if((*it).first){\n-                        qOut.push(std::make_pair((*it).first,order));\n-                        order++;\n-                    }\n-                    elements.erase(it);\n-                    current++;\n-                    break;\n-                }\n-             }\n-             item=q.pop();\n+  atomic<int> nend{0}; // TODO: Find better name?","path":"include/native/pipeline.h","position":null,"original_position":381,"commit_id":"0cbf6b32532ca92dfa32cc3fadb97ac49c61c4e1","original_commit_id":"35513f346a56e35600abc29e1f9f71c7356a5995","user":{"login":"jdgarciauc3m","id":6407837,"avatar_url":"https://avatars1.githubusercontent.com/u/6407837?v=3","gravatar_id":"","url":"https://api.github.com/users/jdgarciauc3m","html_url":"https://github.com/jdgarciauc3m","followers_url":"https://api.github.com/users/jdgarciauc3m/followers","following_url":"https://api.github.com/users/jdgarciauc3m/following{/other_user}","gists_url":"https://api.github.com/users/jdgarciauc3m/gists{/gist_id}","starred_url":"https://api.github.com/users/jdgarciauc3m/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jdgarciauc3m/subscriptions","organizations_url":"https://api.github.com/users/jdgarciauc3m/orgs","repos_url":"https://api.github.com/users/jdgarciauc3m/repos","events_url":"https://api.github.com/users/jdgarciauc3m/events{/privacy}","received_events_url":"https://api.github.com/users/jdgarciauc3m/received_events","type":"User","site_admin":false},"body":"Solved by commit 0cbf6b32532ca92dfa32cc3fadb97ac49c61c4e1","created_at":"2017-07-13T18:30:19Z","updated_at":"2017-07-13T18:30:19Z","html_url":"https://github.com/arcosuc3m/grppi/pull/224#discussion_r127295447","pull_request_url":"https://api.github.com/repos/arcosuc3m/grppi/pulls/224","_links":{"self":{"href":"https://api.github.com/repos/arcosuc3m/grppi/pulls/comments/127295447"},"html":{"href":"https://github.com/arcosuc3m/grppi/pull/224#discussion_r127295447"},"pull_request":{"href":"https://api.github.com/repos/arcosuc3m/grppi/pulls/224"}}},"pull_request":{"url":"https://api.github.com/repos/arcosuc3m/grppi/pulls/224","id":129941112,"html_url":"https://github.com/arcosuc3m/grppi/pull/224","diff_url":"https://github.com/arcosuc3m/grppi/pull/224.diff","patch_url":"https://github.com/arcosuc3m/grppi/pull/224.patch","issue_url":"https://api.github.com/repos/arcosuc3m/grppi/issues/224","number":224,"state":"open","locked":false,"title":"Full review of pipeline documentation - Issue 168","user":{"login":"jdgarciauc3m","id":6407837,"avatar_url":"https://avatars1.githubusercontent.com/u/6407837?v=3","gravatar_id":"","url":"https://api.github.com/users/jdgarciauc3m","html_url":"https://github.com/jdgarciauc3m","followers_url":"https://api.github.com/users/jdgarciauc3m/followers","following_url":"https://api.github.com/users/jdgarciauc3m/following{/other_user}","gists_url":"https://api.github.com/users/jdgarciauc3m/gists{/gist_id}","starred_url":"https://api.github.com/users/jdgarciauc3m/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jdgarciauc3m/subscriptions","organizations_url":"https://api.github.com/users/jdgarciauc3m/orgs","repos_url":"https://api.github.com/users/jdgarciauc3m/repos","events_url":"https://api.github.com/users/jdgarciauc3m/events{/privacy}","received_events_url":"https://api.github.com/users/jdgarciauc3m/received_events","type":"User","site_admin":false},"body":"This PR contains a major update of the documentation for pipeline.\r\n\r\nIt also contains major code edits and simplifications,","created_at":"2017-07-11T15:41:55Z","updated_at":"2017-07-13T18:30:19Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e7e20b182b92c28d1255d63e074b8cd8e2c803b9","assignee":null,"assignees":[],"requested_reviewers":[],"milestone":{"url":"https://api.github.com/repos/arcosuc3m/grppi/milestones/1","html_url":"https://github.com/arcosuc3m/grppi/milestone/1","labels_url":"https://api.github.com/repos/arcosuc3m/grppi/milestones/1/labels","id":2513320,"number":1,"title":"v0.2","description":"Version 0.2","creator":{"login":"jdgarciauc3m","id":6407837,"avatar_url":"https://avatars1.githubusercontent.com/u/6407837?v=3","gravatar_id":"","url":"https://api.github.com/users/jdgarciauc3m","html_url":"https://github.com/jdgarciauc3m","followers_url":"https://api.github.com/users/jdgarciauc3m/followers","following_url":"https://api.github.com/users/jdgarciauc3m/following{/other_user}","gists_url":"https://api.github.com/users/jdgarciauc3m/gists{/gist_id}","starred_url":"https://api.github.com/users/jdgarciauc3m/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jdgarciauc3m/subscriptions","organizations_url":"https://api.github.com/users/jdgarciauc3m/orgs","repos_url":"https://api.github.com/users/jdgarciauc3m/repos","events_url":"https://api.github.com/users/jdgarciauc3m/events{/privacy}","received_events_url":"https://api.github.com/users/jdgarciauc3m/received_events","type":"User","site_admin":false},"open_issues":14,"closed_issues":119,"state":"open","created_at":"2017-05-10T17:48:40Z","updated_at":"2017-07-12T18:50:13Z","due_on":"2017-07-21T07:00:00Z","closed_at":null},"commits_url":"https://api.github.com/repos/arcosuc3m/grppi/pulls/224/commits","review_comments_url":"https://api.github.com/repos/arcosuc3m/grppi/pulls/224/comments","review_comment_url":"https://api.github.com/repos/arcosuc3m/grppi/pulls/comments{/number}","comments_url":"https://api.github.com/repos/arcosuc3m/grppi/issues/224/comments","statuses_url":"https://api.github.com/repos/arcosuc3m/grppi/statuses/0cbf6b32532ca92dfa32cc3fadb97ac49c61c4e1","head":{"label":"arcosuc3m:issue-168","ref":"issue-168","sha":"0cbf6b32532ca92dfa32cc3fadb97ac49c61c4e1","user":{"login":"arcosuc3m","id":19761216,"avatar_url":"https://avatars0.githubusercontent.com/u/19761216?v=3","gravatar_id":"","url":"https://api.github.com/users/arcosuc3m","html_url":"https://github.com/arcosuc3m","followers_url":"https://api.github.com/users/arcosuc3m/followers","following_url":"https://api.github.com/users/arcosuc3m/following{/other_user}","gists_url":"https://api.github.com/users/arcosuc3m/gists{/gist_id}","starred_url":"https://api.github.com/users/arcosuc3m/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/arcosuc3m/subscriptions","organizations_url":"https://api.github.com/users/arcosuc3m/orgs","repos_url":"https://api.github.com/users/arcosuc3m/repos","events_url":"https://api.github.com/users/arcosuc3m/events{/privacy}","received_events_url":"https://api.github.com/users/arcosuc3m/received_events","type":"Organization","site_admin":false},"repo":{"id":82172511,"name":"grppi","full_name":"arcosuc3m/grppi","owner":{"login":"arcosuc3m","id":19761216,"avatar_url":"https://avatars0.githubusercontent.com/u/19761216?v=3","gravatar_id":"","url":"https://api.github.com/users/arcosuc3m","html_url":"https://github.com/arcosuc3m","followers_url":"https://api.github.com/users/arcosuc3m/followers","following_url":"https://api.github.com/users/arcosuc3m/following{/other_user}","gists_url":"https://api.github.com/users/arcosuc3m/gists{/gist_id}","starred_url":"https://api.github.com/users/arcosuc3m/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/arcosuc3m/subscriptions","organizations_url":"https://api.github.com/users/arcosuc3m/orgs","repos_url":"https://api.github.com/users/arcosuc3m/repos","events_url":"https://api.github.com/users/arcosuc3m/events{/privacy}","received_events_url":"https://api.github.com/users/arcosuc3m/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/arcosuc3m/grppi","description":"Generic Reusable Parallel Patterns Interface","fork":false,"url":"https://api.github.com/repos/arcosuc3m/grppi","forks_url":"https://api.github.com/repos/arcosuc3m/grppi/forks","keys_url":"https://api.github.com/repos/arcosuc3m/grppi/keys{/key_id}","collaborators_url":"https://api.github.com/repos/arcosuc3m/grppi/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/arcosuc3m/grppi/teams","hooks_url":"https://api.github.com/repos/arcosuc3m/grppi/hooks","issue_events_url":"https://api.github.com/repos/arcosuc3m/grppi/issues/events{/number}","events_url":"https://api.github.com/repos/arcosuc3m/grppi/events","assignees_url":"https://api.github.com/repos/arcosuc3m/grppi/assignees{/user}","branches_url":"https://api.github.com/repos/arcosuc3m/grppi/branches{/branch}","tags_url":"https://api.github.com/repos/arcosuc3m/grppi/tags","blobs_url":"https://api.github.com/repos/arcosuc3m/grppi/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/arcosuc3m/grppi/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/arcosuc3m/grppi/git/refs{/sha}","trees_url":"https://api.github.com/repos/arcosuc3m/grppi/git/trees{/sha}","statuses_url":"https://api.github.com/repos/arcosuc3m/grppi/statuses/{sha}","languages_url":"https://api.github.com/repos/arcosuc3m/grppi/languages","stargazers_url":"https://api.github.com/repos/arcosuc3m/grppi/stargazers","contributors_url":"https://api.github.com/repos/arcosuc3m/grppi/contributors","subscribers_url":"https://api.github.com/repos/arcosuc3m/grppi/subscribers","subscription_url":"https://api.github.com/repos/arcosuc3m/grppi/subscription","commits_url":"https://api.github.com/repos/arcosuc3m/grppi/commits{/sha}","git_commits_url":"https://api.github.com/repos/arcosuc3m/grppi/git/commits{/sha}","comments_url":"https://api.github.com/repos/arcosuc3m/grppi/comments{/number}","issue_comment_url":"https://api.github.com/repos/arcosuc3m/grppi/issues/comments{/number}","contents_url":"https://api.github.com/repos/arcosuc3m/grppi/contents/{+path}","compare_url":"https://api.github.com/repos/arcosuc3m/grppi/compare/{base}...{head}","merges_url":"https://api.github.com/repos/arcosuc3m/grppi/merges","archive_url":"https://api.github.com/repos/arcosuc3m/grppi/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/arcosuc3m/grppi/downloads","issues_url":"https://api.github.com/repos/arcosuc3m/grppi/issues{/number}","pulls_url":"https://api.github.com/repos/arcosuc3m/grppi/pulls{/number}","milestones_url":"https://api.github.com/repos/arcosuc3m/grppi/milestones{/number}","notifications_url":"https://api.github.com/repos/arcosuc3m/grppi/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/arcosuc3m/grppi/labels{/name}","releases_url":"https://api.github.com/repos/arcosuc3m/grppi/releases{/id}","deployments_url":"https://api.github.com/repos/arcosuc3m/grppi/deployments","created_at":"2017-02-16T11:13:19Z","updated_at":"2017-05-05T08:22:47Z","pushed_at":"2017-07-13T18:29:20Z","git_url":"git://github.com/arcosuc3m/grppi.git","ssh_url":"git@github.com:arcosuc3m/grppi.git","clone_url":"https://github.com/arcosuc3m/grppi.git","svn_url":"https://github.com/arcosuc3m/grppi","homepage":null,"size":961,"stargazers_count":1,"watchers_count":1,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":34,"forks":0,"open_issues":34,"watchers":1,"default_branch":"master"}},"base":{"label":"arcosuc3m:latest","ref":"latest","sha":"4a227f1e9d6f9898fb88e17c295fbd491002b0b6","user":{"login":"arcosuc3m","id":19761216,"avatar_url":"https://avatars0.githubusercontent.com/u/19761216?v=3","gravatar_id":"","url":"https://api.github.com/users/arcosuc3m","html_url":"https://github.com/arcosuc3m","followers_url":"https://api.github.com/users/arcosuc3m/followers","following_url":"https://api.github.com/users/arcosuc3m/following{/other_user}","gists_url":"https://api.github.com/users/arcosuc3m/gists{/gist_id}","starred_url":"https://api.github.com/users/arcosuc3m/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/arcosuc3m/subscriptions","organizations_url":"https://api.github.com/users/arcosuc3m/orgs","repos_url":"https://api.github.com/users/arcosuc3m/repos","events_url":"https://api.github.com/users/arcosuc3m/events{/privacy}","received_events_url":"https://api.github.com/users/arcosuc3m/received_events","type":"Organization","site_admin":false},"repo":{"id":82172511,"name":"grppi","full_name":"arcosuc3m/grppi","owner":{"login":"arcosuc3m","id":19761216,"avatar_url":"https://avatars0.githubusercontent.com/u/19761216?v=3","gravatar_id":"","url":"https://api.github.com/users/arcosuc3m","html_url":"https://github.com/arcosuc3m","followers_url":"https://api.github.com/users/arcosuc3m/followers","following_url":"https://api.github.com/users/arcosuc3m/following{/other_user}","gists_url":"https://api.github.com/users/arcosuc3m/gists{/gist_id}","starred_url":"https://api.github.com/users/arcosuc3m/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/arcosuc3m/subscriptions","organizations_url":"https://api.github.com/users/arcosuc3m/orgs","repos_url":"https://api.github.com/users/arcosuc3m/repos","events_url":"https://api.github.com/users/arcosuc3m/events{/privacy}","received_events_url":"https://api.github.com/users/arcosuc3m/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/arcosuc3m/grppi","description":"Generic Reusable Parallel Patterns Interface","fork":false,"url":"https://api.github.com/repos/arcosuc3m/grppi","forks_url":"https://api.github.com/repos/arcosuc3m/grppi/forks","keys_url":"https://api.github.com/repos/arcosuc3m/grppi/keys{/key_id}","collaborators_url":"https://api.github.com/repos/arcosuc3m/grppi/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/arcosuc3m/grppi/teams","hooks_url":"https://api.github.com/repos/arcosuc3m/grppi/hooks","issue_events_url":"https://api.github.com/repos/arcosuc3m/grppi/issues/events{/number}","events_url":"https://api.github.com/repos/arcosuc3m/grppi/events","assignees_url":"https://api.github.com/repos/arcosuc3m/grppi/assignees{/user}","branches_url":"https://api.github.com/repos/arcosuc3m/grppi/branches{/branch}","tags_url":"https://api.github.com/repos/arcosuc3m/grppi/tags","blobs_url":"https://api.github.com/repos/arcosuc3m/grppi/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/arcosuc3m/grppi/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/arcosuc3m/grppi/git/refs{/sha}","trees_url":"https://api.github.com/repos/arcosuc3m/grppi/git/trees{/sha}","statuses_url":"https://api.github.com/repos/arcosuc3m/grppi/statuses/{sha}","languages_url":"https://api.github.com/repos/arcosuc3m/grppi/languages","stargazers_url":"https://api.github.com/repos/arcosuc3m/grppi/stargazers","contributors_url":"https://api.github.com/repos/arcosuc3m/grppi/contributors","subscribers_url":"https://api.github.com/repos/arcosuc3m/grppi/subscribers","subscription_url":"https://api.github.com/repos/arcosuc3m/grppi/subscription","commits_url":"https://api.github.com/repos/arcosuc3m/grppi/commits{/sha}","git_commits_url":"https://api.github.com/repos/arcosuc3m/grppi/git/commits{/sha}","comments_url":"https://api.github.com/repos/arcosuc3m/grppi/comments{/number}","issue_comment_url":"https://api.github.com/repos/arcosuc3m/grppi/issues/comments{/number}","contents_url":"https://api.github.com/repos/arcosuc3m/grppi/contents/{+path}","compare_url":"https://api.github.com/repos/arcosuc3m/grppi/compare/{base}...{head}","merges_url":"https://api.github.com/repos/arcosuc3m/grppi/merges","archive_url":"https://api.github.com/repos/arcosuc3m/grppi/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/arcosuc3m/grppi/downloads","issues_url":"https://api.github.com/repos/arcosuc3m/grppi/issues{/number}","pulls_url":"https://api.github.com/repos/arcosuc3m/grppi/pulls{/number}","milestones_url":"https://api.github.com/repos/arcosuc3m/grppi/milestones{/number}","notifications_url":"https://api.github.com/repos/arcosuc3m/grppi/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/arcosuc3m/grppi/labels{/name}","releases_url":"https://api.github.com/repos/arcosuc3m/grppi/releases{/id}","deployments_url":"https://api.github.com/repos/arcosuc3m/grppi/deployments","created_at":"2017-02-16T11:13:19Z","updated_at":"2017-05-05T08:22:47Z","pushed_at":"2017-07-13T18:29:20Z","git_url":"git://github.com/arcosuc3m/grppi.git","ssh_url":"git@github.com:arcosuc3m/grppi.git","clone_url":"https://github.com/arcosuc3m/grppi.git","svn_url":"https://github.com/arcosuc3m/grppi","homepage":null,"size":961,"stargazers_count":1,"watchers_count":1,"language":"C++","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":34,"forks":0,"open_issues":34,"watchers":1,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/arcosuc3m/grppi/pulls/224"},"html":{"href":"https://github.com/arcosuc3m/grppi/pull/224"},"issue":{"href":"https://api.github.com/repos/arcosuc3m/grppi/issues/224"},"comments":{"href":"https://api.github.com/repos/arcosuc3m/grppi/issues/224/comments"},"review_comments":{"href":"https://api.github.com/repos/arcosuc3m/grppi/pulls/224/comments"},"review_comment":{"href":"https://api.github.com/repos/arcosuc3m/grppi/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/arcosuc3m/grppi/pulls/224/commits"},"statuses":{"href":"https://api.github.com/repos/arcosuc3m/grppi/statuses/0cbf6b32532ca92dfa32cc3fadb97ac49c61c4e1"}}}}
{"actor":{"display_login":"jdgarciauc3m"}}