GitHub PullRequestReviewCommentEvent at 2014-06-30 19:51:02
Repository: spirit
Actor: teajay-fr
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/boostorg/spirit/pulls/comments/14371246","id":14371246,"diff_hunk":"@@ -0,0 +1,422 @@\n+/*=============================================================================\n+  Copyright (c) 2014 Thomas Benard\n+\n+  Distributed under the Boost Software License, Version 1.0. (See accompanying\n+  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)\n+  ==============================================================================*/\n+#if !defined(BOOST_SPIRIT_X3_KEYWORD_NOV_29_2013)\n+#define BOOST_SPIRIT_X3_KEYWORD_NOV_29_2013\n+\n+#if defined(_MSC_VER)\n+#pragma once\n+#endif\n+\n+#include <boost/spirit/home/x3/core/parser.hpp>\n+#include <boost/spirit/home/x3/core/skip_over.hpp>\n+#include <boost/spirit/home/x3/string/detail/string_parse.hpp>\n+#include <boost/spirit/home/x3/support/utility/utf8.hpp>\n+#include <boost/spirit/home/x3/support/utility/unrefcv.hpp>\n+#include <boost/spirit/home/x3/support/utility/integer_sequence.hpp>\n+#include <boost/spirit/home/support/char_encoding/ascii.hpp>\n+#include <boost/spirit/home/support/char_encoding/standard.hpp>\n+#include <boost/spirit/home/support/char_encoding/standard_wide.hpp>\n+#include <boost/spirit/home/x3/string/symbols.hpp>\n+#include <boost/spirit/home/x3/extensions/infinite_tag.hpp>\n+\n+#include <boost/array.hpp>\n+\n+#include <string>\n+\n+namespace boost { namespace spirit { namespace x3 { namespace detail {\n+\n+    // Helper to filter out unused attributes\n+    template <int... Is>\n+        struct attribute_index {};\n+\n+    template <typename Context, typename Keywords, int AttrIdx, int ParserIdx, int N, int ... Is>\n+        struct gen_attribute_seq;\n+\n+    template <typename Context, typename Keywords, int AttrIdx, int ParserIdx, int N, bool HasAttr, int ... Is>\n+        struct gen_attribute_seq_detail : \n+            gen_attribute_seq< Context, Keywords, AttrIdx+1, ParserIdx +1, N-1, Is ..., AttrIdx> {};\n+\n+    template <typename Context, typename Keywords, int AttrIdx, int ParserIdx, int N, int ... Is>\n+        struct gen_attribute_seq_detail<Context, Keywords, AttrIdx, ParserIdx, N, false, Is...> :\n+            gen_attribute_seq< Context, Keywords, AttrIdx, ParserIdx +1, N-1, Is..., -1 > {};\n+\n+    template <typename Context, typename Keywords, int AttrIdx, int ParserIdx, int N, int ... Is>\n+        struct gen_attribute_seq : \n+            gen_attribute_seq_detail<Context, Keywords, AttrIdx, ParserIdx, N, \n+                traits::has_attribute< typename std::tuple_element<ParserIdx, Keywords>::type, Context >::value, Is...\n+                > {};\n+\n+    template <typename Context, typename Keywords, int AttrIdx, int ParserIdx, int ... Is>\n+        struct gen_attribute_seq<Context, Keywords, AttrIdx, ParserIdx, 0, Is...> : \n+            attribute_index<Is...> {};\n+\n+    template <int N, int... Is>\n+        struct gen_unused_attribute_seq : gen_unused_attribute_seq<N - 1, - 1, Is...> {};\n+\n+    template <int... Is>\n+        struct gen_unused_attribute_seq<0, Is...> : attribute_index<Is...> {};\n+\n+    // Helper to get the attribute at a given index\n+    template <typename Attribute, int Index>\n+        struct get_attribute\n+        {\n+            typedef typename fusion::result_of::at_c<Attribute, Index>::type type;\n+            static typename add_reference<type>::type call(Attribute &s)\n+            {\n+                return fusion::at_c<Index>(s);\n+            }\n+\n+        };\n+\n+    template <typename Attribute>\n+        struct get_attribute<Attribute, -1 >\n+        {\n+            static unused_type& call(Attribute &s)\n+            {\n+                static unused_type result;\n+                return result;\n+            }\n+        };\n+    // Helper to add the keyword strings to the lookup map\n+    struct keyword_string\n+    {\n+        template <typename Lookup, typename Keyword>\n+            static void add(Lookup &lookup, Keyword const &parser, int index)\n+            {\n+                lookup.add(traits::get_string_begin<char>(parser.key.str),\n+                        traits::get_string_end<char>(parser.key.str),\n+                        index);\n+            }\n+        template <typename Lookup, typename Keyword, typename Action>\n+            static void add(Lookup &lookup, action<Keyword, Action> const &parser, int index)\n+            {\n+                lookup.add(traits::get_string_begin<char>(parser.subject.key.str),\n+                        traits::get_string_end<char>(parser.subject.key.str),\n+                        index);\n+            }\n+    };\n+\n+    // Helper to get the character type from the first keyword in the list\n+    template <typename Keyword, typename ...Keywords>\n+    struct get_char_type\n+    {\n+        typedef typename Keyword::char_type type;\n+    };\n+    // Occurence checking classes \n+\n+\n+    struct kwd_ignore_count // handles kwd[p]\n+    {\n+        bool flag_init() const { return true; }\n+        template <typename T>\n+        bool register_successful_parse(bool &flag, T &i) const {\n+            flag=true;\n+            return true;\n+        }\n+    };\n+\n+    template <typename T>\n+    struct kwd_exact_count // handles kwd(exact)[p]\n+    {\n+        typedef T type;\n+        bool flag_init() const { return false; }\n+        bool register_successful_parse(bool &flag, T &i) const {\n+            i++;\n+            if(i<exact)\n+            {\n+                flag=false;\n+                return true;\n+            }\n+            else if(i==exact)\n+            {\n+                flag=true;\n+                return true;\n+            }\n+            else\n+                return flag=false;\n+\n+        }\n+        T const exact;\n+    };\n+\n+    template <typename T>\n+    struct kwd_finite_count // handles kwd(min, max)[p]\n+    {\n+        typedef T type;\n+        bool flag_init() const { return min_value==0; }\n+        bool register_successful_parse(bool &flag, T &i) const {\n+            i++;\n+            if(i<min_value)\n+            {\n+                flag=false;\n+                return true;\n+            }\n+            else if(i>=min_value && i<=max_value)\n+            {\n+                return flag=true;\n+            }\n+            else\n+                return flag=false;\n+        }\n+        T const min_value;\n+        T const max_value;\n+    };\n+\n+    template <typename T>\n+    struct kwd_infinite_count // handles kwd(min, inf)[p]\n+    {\n+\n+        typedef T type;\n+        bool flag_init() const { return min_value==0; }\n+        bool register_successful_parse(bool &flag, T &i) const {\n+            i++;\n+            flag = i>=min_value;\n+            return true;\n+        }\n+        T const min_value;\n+    };\n+\n+\n+}}}}\n+\n+\n+namespace boost { namespace spirit { namespace x3 {\n+\n+    // simple keyword parser\n+    template <typename Key, typename RepeatCountLimit, typename Subject>\n+        struct keyword_parser : unary_parser<Subject, keyword_parser<Key, RepeatCountLimit, Subject> >\n+    {\n+        typedef unary_parser<Subject, keyword_parser<Key, RepeatCountLimit, Subject> > base_type;\n+        \n+        typedef typename Key::char_type char_type;\n+\n+        static const bool is_pass_through_unary =true;\n+\n+        keyword_parser(Key const &key, RepeatCountLimit const &repeat_limit, Subject const& subject)\n+            : base_type(subject)\n+            , key(key)\n+            , repeat_limit(repeat_limit)\n+        {}\n+\n+        template <typename Iterator, typename Context, typename RContext, typename Attribute>\n+            bool parse(Iterator& first, Iterator const& last\n+                    , Context const& context, RContext &rcontext, Attribute& attr) const\n+            {\n+                bool flag = repeat_limit.flag_init();\n+                int counter {};\n+                Iterator save = first;\n+                if (key.parse(first, last, context, rcontext, unused))\n+                {\n+                    if(this->subject.parse(first, last, context, rcontext, attr))\n+                    {\n+                        return repeat_limit.register_successful_parse(flag, counter);\n+                    }\n+                }\n+                first = save;\n+                return flag;\n+            }\n+\n+        template <typename Iterator, typename Context, typename RContext, typename Attribute>\n+            bool parse_subject(Iterator& first, Iterator const& last\n+                    , Context const& context, RContext & rcontext\n+                    , bool &flag, int &counter, Attribute& attr) const\n+            {\n+                if(this->subject.parse(first, last, context, rcontext, attr))\n+                    return repeat_limit.register_successful_parse(flag, counter);\n+                return false;\n+            }\n+ \n+        Key key;\n+        RepeatCountLimit repeat_limit;\n+    };\n+    // Two stage generator for the kwd parser / directive\n+\n+    template <typename Key, typename RepeatCountLimit>\n+        struct kwd_level_1\n+        {\n+            template <typename Subject>\n+                keyword_parser< \n+                       Key\n+                      , RepeatCountLimit\n+                      , typename extension::as_parser<Subject>::value_type \n+                              >\n+                operator[](Subject const& subject) const\n+                {\n+                    return {key, repeat_limit, as_parser(subject)};\n+                }\n+            Key key;\n+            RepeatCountLimit repeat_limit;\n+        };\n+\n+    // Handle kwd(\"key\")[p]\n+    template <typename Key>\n+        kwd_level_1<typename extension::as_parser<Key>::value_type, detail::kwd_ignore_count >\n+        kwd(Key const &key) \n+        {\n+            return {as_parser(key), detail::kwd_ignore_count()};\n+        }\n+\n+    // Handle kwd(\"key\", exact)[p]\n+    template <typename Key, typename T>\n+        kwd_level_1<typename extension::as_parser<Key>::value_type, detail::kwd_exact_count<T> >\n+        kwd(Key const &key, T const exact)\n+        {\n+            return {as_parser(key), detail::kwd_exact_count<T>{exact}};\n+        }\n+    // Handle kwd(\"key\", min, max)[p]\n+    template <typename Key, typename T>\n+        kwd_level_1<typename extension::as_parser<Key>::value_type, detail::kwd_finite_count<T> >\n+        kwd(Key const &key, T const min_value, T const max_value)\n+        {\n+            return {as_parser(key), detail::kwd_finite_count<T>{min_value, max_value}};\n+        }\n+\n+    // Handle kwd(\"key\", min, inf)[p]\n+    template <typename Key, typename T>\n+        kwd_level_1<typename extension::as_parser<Key>::value_type, detail::kwd_infinite_count<T> >\n+        kwd(Key const &key, T const min_value, inf_type const )\n+        {\n+            return {as_parser(key), detail::kwd_infinite_count<T>{min_value}};\n+        }\n+\n+    // keywords parser \n+\n+    template <typename ...Keywords> \n+        struct keywords_parser : parser< keywords_parser< Keywords ...> >\n+    {             \n+\n+        typedef parser< keywords_parser< Keywords... > > base_type;\n+\n+        typedef typename detail::get_char_type< Keywords... >::type char_type;\n+\n+        static const std::size_t nb_keywords = sizeof...(Keywords);\n+\n+        // build a bool array and an integer array which will be used to\n+        // check that the repetition constraints of the kwd parsers are\n+        // met and bail out a soon as possible\n+        typedef boost::array<bool, nb_keywords> flags_type;\n+        typedef boost::array<int, nb_keywords> counters_type;\n+\n+\n+        keywords_parser(Keywords ... keywords)\n+            : keywords(std::forward<Keywords>(keywords)...)\n+        {\n+            add_keywords(0, keywords...);\n+        }\n+\n+        // construct the lookup table\n+        void add_keywords(int index)\n+        {\n+        }\n+\n+        template <typename keywordType, typename ... rest>\n+            void add_keywords(int index, keywordType const &keyword, rest const&... keywords)\n+            {\n+                // If you get an error here you are probably mixing\n+                // wide characters with normal characters in you keywords\n+                detail::keyword_string::add(lookup, keyword, index);\n+                flags_init[index]=keyword.repeat_limit.flag_init();\n+                add_keywords(index+1, keywords ...);\n+            }\n+\n+        // Subject parser calling function\n+        template <int ParserIdx, typename GetAttribute, typename Iterator, typename Context, typename RContext, typename Attribute>\n+            bool parse_subject(Iterator& first, Iterator const& last\n+                    , Context const& context, RContext &rcontext, bool &flag, int & counter, Attribute& attr) const\n+            {\n+                return std::get<ParserIdx>(keywords).parse_subject(first, last, context, rcontext, flag, counter, GetAttribute::call(attr));\n+            }\n+        // Internal dispatching function used to call the correct parser depending on the keyword\n+        template <typename Iterator, typename Context, typename RContext, typename Attribute, std::size_t... Is, int... As>\n+            bool parse_internal(Iterator& first, Iterator const& last\n+                    , Context const& context, RContext &rcontext, Attribute& attr, index_sequence<Is...>, detail::attribute_index<As...> ) const\n+            {\n+                typedef bool (keywords_parser::* subject_caller) (Iterator &, Iterator const&, Context const&, RContext &, bool &, int &, Attribute &) const;\n+                static subject_caller parse_functions[nb_keywords] =","path":"include/boost/spirit/home/x3/extensions/keyword.hpp","position":339,"original_position":339,"commit_id":"1845d50f95287b12c85aafea7ae48f6847df1406","original_commit_id":"1845d50f95287b12c85aafea7ae48f6847df1406","user":{"login":"teajay-fr","id":5994835,"avatar_url":"https://avatars.githubusercontent.com/u/5994835?","gravatar_id":"0cda5b469523b64ac5c93888e42439fc","url":"https://api.github.com/users/teajay-fr","html_url":"https://github.com/teajay-fr","followers_url":"https://api.github.com/users/teajay-fr/followers","following_url":"https://api.github.com/users/teajay-fr/following{/other_user}","gists_url":"https://api.github.com/users/teajay-fr/gists{/gist_id}","starred_url":"https://api.github.com/users/teajay-fr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/teajay-fr/subscriptions","organizations_url":"https://api.github.com/users/teajay-fr/orgs","repos_url":"https://api.github.com/users/teajay-fr/repos","events_url":"https://api.github.com/users/teajay-fr/events{/privacy}","received_events_url":"https://api.github.com/users/teajay-fr/received_events","type":"User","site_admin":false},"body":"1. I'm not sure this is an option. I need the index to be able to index the flags and counters to perform the range checking. That would mean defining a lambda which would postpone the indexing of flags and counters farther down the call path. It's worth a try. \r\n\r\n2. Ok for the const.","created_at":"2014-06-30T19:51:02Z","updated_at":"2014-06-30T19:51:02Z","html_url":"https://github.com/boostorg/spirit/pull/41#discussion_r14371246","pull_request_url":"https://api.github.com/repos/boostorg/spirit/pulls/41","_links":{"self":{"href":"https://api.github.com/repos/boostorg/spirit/pulls/comments/14371246"},"html":{"href":"https://github.com/boostorg/spirit/pull/41#discussion_r14371246"},"pull_request":{"href":"https://api.github.com/repos/boostorg/spirit/pulls/41"}}},"pull_request":{"url":"https://api.github.com/repos/boostorg/spirit/pulls/41","id":17748851,"html_url":"https://github.com/boostorg/spirit/pull/41","diff_url":"https://github.com/boostorg/spirit/pull/41.diff","patch_url":"https://github.com/boostorg/spirit/pull/41.patch","issue_url":"https://api.github.com/repos/boostorg/spirit/issues/41","number":41,"state":"open","title":"Feature/x3 keywords","user":{"login":"teajay-fr","id":5994835,"avatar_url":"https://avatars.githubusercontent.com/u/5994835?","gravatar_id":"0cda5b469523b64ac5c93888e42439fc","url":"https://api.github.com/users/teajay-fr","html_url":"https://github.com/teajay-fr","followers_url":"https://api.github.com/users/teajay-fr/followers","following_url":"https://api.github.com/users/teajay-fr/following{/other_user}","gists_url":"https://api.github.com/users/teajay-fr/gists{/gist_id}","starred_url":"https://api.github.com/users/teajay-fr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/teajay-fr/subscriptions","organizations_url":"https://api.github.com/users/teajay-fr/orgs","repos_url":"https://api.github.com/users/teajay-fr/repos","events_url":"https://api.github.com/users/teajay-fr/events{/privacy}","received_events_url":"https://api.github.com/users/teajay-fr/received_events","type":"User","site_admin":false},"body":"This pull request adds the keyword parser to the extensions. This only covers the case sensitive version. \r\nShould case insensitive behavior be necessary I can extend this in the future.\r\n\r\nI consider this version of the keywords parser as suitable to be merged into develop.\r\nShould something be wrong, or missing, or to be improved please let me know.\r\n","created_at":"2014-06-29T17:25:08Z","updated_at":"2014-06-30T19:51:02Z","closed_at":null,"merged_at":null,"merge_commit_sha":"116a051e15601733c5652f567cecc4add3e60052","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/boostorg/spirit/pulls/41/commits","review_comments_url":"https://api.github.com/repos/boostorg/spirit/pulls/41/comments","review_comment_url":"https://api.github.com/repos/boostorg/spirit/pulls/comments/{number}","comments_url":"https://api.github.com/repos/boostorg/spirit/issues/41/comments","statuses_url":"https://api.github.com/repos/boostorg/spirit/statuses/1845d50f95287b12c85aafea7ae48f6847df1406","head":{"label":"teajay-fr:feature/x3_keywords","ref":"feature/x3_keywords","sha":"1845d50f95287b12c85aafea7ae48f6847df1406","user":{"login":"teajay-fr","id":5994835,"avatar_url":"https://avatars.githubusercontent.com/u/5994835?","gravatar_id":"0cda5b469523b64ac5c93888e42439fc","url":"https://api.github.com/users/teajay-fr","html_url":"https://github.com/teajay-fr","followers_url":"https://api.github.com/users/teajay-fr/followers","following_url":"https://api.github.com/users/teajay-fr/following{/other_user}","gists_url":"https://api.github.com/users/teajay-fr/gists{/gist_id}","starred_url":"https://api.github.com/users/teajay-fr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/teajay-fr/subscriptions","organizations_url":"https://api.github.com/users/teajay-fr/orgs","repos_url":"https://api.github.com/users/teajay-fr/repos","events_url":"https://api.github.com/users/teajay-fr/events{/privacy}","received_events_url":"https://api.github.com/users/teajay-fr/received_events","type":"User","site_admin":false},"repo":{"id":18224745,"name":"spirit","full_name":"teajay-fr/spirit","owner":{"login":"teajay-fr","id":5994835,"avatar_url":"https://avatars.githubusercontent.com/u/5994835?","gravatar_id":"0cda5b469523b64ac5c93888e42439fc","url":"https://api.github.com/users/teajay-fr","html_url":"https://github.com/teajay-fr","followers_url":"https://api.github.com/users/teajay-fr/followers","following_url":"https://api.github.com/users/teajay-fr/following{/other_user}","gists_url":"https://api.github.com/users/teajay-fr/gists{/gist_id}","starred_url":"https://api.github.com/users/teajay-fr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/teajay-fr/subscriptions","organizations_url":"https://api.github.com/users/teajay-fr/orgs","repos_url":"https://api.github.com/users/teajay-fr/repos","events_url":"https://api.github.com/users/teajay-fr/events{/privacy}","received_events_url":"https://api.github.com/users/teajay-fr/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/teajay-fr/spirit","description":"Boost.org spirit module","fork":true,"url":"https://api.github.com/repos/teajay-fr/spirit","forks_url":"https://api.github.com/repos/teajay-fr/spirit/forks","keys_url":"https://api.github.com/repos/teajay-fr/spirit/keys{/key_id}","collaborators_url":"https://api.github.com/repos/teajay-fr/spirit/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/teajay-fr/spirit/teams","hooks_url":"https://api.github.com/repos/teajay-fr/spirit/hooks","issue_events_url":"https://api.github.com/repos/teajay-fr/spirit/issues/events{/number}","events_url":"https://api.github.com/repos/teajay-fr/spirit/events","assignees_url":"https://api.github.com/repos/teajay-fr/spirit/assignees{/user}","branches_url":"https://api.github.com/repos/teajay-fr/spirit/branches{/branch}","tags_url":"https://api.github.com/repos/teajay-fr/spirit/tags","blobs_url":"https://api.github.com/repos/teajay-fr/spirit/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/teajay-fr/spirit/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/teajay-fr/spirit/git/refs{/sha}","trees_url":"https://api.github.com/repos/teajay-fr/spirit/git/trees{/sha}","statuses_url":"https://api.github.com/repos/teajay-fr/spirit/statuses/{sha}","languages_url":"https://api.github.com/repos/teajay-fr/spirit/languages","stargazers_url":"https://api.github.com/repos/teajay-fr/spirit/stargazers","contributors_url":"https://api.github.com/repos/teajay-fr/spirit/contributors","subscribers_url":"https://api.github.com/repos/teajay-fr/spirit/subscribers","subscription_url":"https://api.github.com/repos/teajay-fr/spirit/subscription","commits_url":"https://api.github.com/repos/teajay-fr/spirit/commits{/sha}","git_commits_url":"https://api.github.com/repos/teajay-fr/spirit/git/commits{/sha}","comments_url":"https://api.github.com/repos/teajay-fr/spirit/comments{/number}","issue_comment_url":"https://api.github.com/repos/teajay-fr/spirit/issues/comments/{number}","contents_url":"https://api.github.com/repos/teajay-fr/spirit/contents/{+path}","compare_url":"https://api.github.com/repos/teajay-fr/spirit/compare/{base}...{head}","merges_url":"https://api.github.com/repos/teajay-fr/spirit/merges","archive_url":"https://api.github.com/repos/teajay-fr/spirit/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/teajay-fr/spirit/downloads","issues_url":"https://api.github.com/repos/teajay-fr/spirit/issues{/number}","pulls_url":"https://api.github.com/repos/teajay-fr/spirit/pulls{/number}","milestones_url":"https://api.github.com/repos/teajay-fr/spirit/milestones{/number}","notifications_url":"https://api.github.com/repos/teajay-fr/spirit/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/teajay-fr/spirit/labels{/name}","releases_url":"https://api.github.com/repos/teajay-fr/spirit/releases{/id}","created_at":"2014-03-28T19:58:40Z","updated_at":"2014-05-30T05:26:32Z","pushed_at":"2014-06-29T17:19:01Z","git_url":"git://github.com/teajay-fr/spirit.git","ssh_url":"git@github.com:teajay-fr/spirit.git","clone_url":"https://github.com/teajay-fr/spirit.git","svn_url":"https://github.com/teajay-fr/spirit","homepage":"http://boost.org/libs/spirit","size":121182,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"develop"}},"base":{"label":"boostorg:develop","ref":"develop","sha":"e95d80d682916779c88599c7f3ce197e5877cdaf","user":{"login":"boostorg","id":3170529,"avatar_url":"https://avatars.githubusercontent.com/u/3170529?","gravatar_id":"4cd3bf7ce3e8288d97ef87420804a285","url":"https://api.github.com/users/boostorg","html_url":"https://github.com/boostorg","followers_url":"https://api.github.com/users/boostorg/followers","following_url":"https://api.github.com/users/boostorg/following{/other_user}","gists_url":"https://api.github.com/users/boostorg/gists{/gist_id}","starred_url":"https://api.github.com/users/boostorg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/boostorg/subscriptions","organizations_url":"https://api.github.com/users/boostorg/orgs","repos_url":"https://api.github.com/users/boostorg/repos","events_url":"https://api.github.com/users/boostorg/events{/privacy}","received_events_url":"https://api.github.com/users/boostorg/received_events","type":"Organization","site_admin":false},"repo":{"id":7589947,"name":"spirit","full_name":"boostorg/spirit","owner":{"login":"boostorg","id":3170529,"avatar_url":"https://avatars.githubusercontent.com/u/3170529?","gravatar_id":"4cd3bf7ce3e8288d97ef87420804a285","url":"https://api.github.com/users/boostorg","html_url":"https://github.com/boostorg","followers_url":"https://api.github.com/users/boostorg/followers","following_url":"https://api.github.com/users/boostorg/following{/other_user}","gists_url":"https://api.github.com/users/boostorg/gists{/gist_id}","starred_url":"https://api.github.com/users/boostorg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/boostorg/subscriptions","organizations_url":"https://api.github.com/users/boostorg/orgs","repos_url":"https://api.github.com/users/boostorg/repos","events_url":"https://api.github.com/users/boostorg/events{/privacy}","received_events_url":"https://api.github.com/users/boostorg/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/boostorg/spirit","description":"Boost.org spirit module","fork":false,"url":"https://api.github.com/repos/boostorg/spirit","forks_url":"https://api.github.com/repos/boostorg/spirit/forks","keys_url":"https://api.github.com/repos/boostorg/spirit/keys{/key_id}","collaborators_url":"https://api.github.com/repos/boostorg/spirit/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/boostorg/spirit/teams","hooks_url":"https://api.github.com/repos/boostorg/spirit/hooks","issue_events_url":"https://api.github.com/repos/boostorg/spirit/issues/events{/number}","events_url":"https://api.github.com/repos/boostorg/spirit/events","assignees_url":"https://api.github.com/repos/boostorg/spirit/assignees{/user}","branches_url":"https://api.github.com/repos/boostorg/spirit/branches{/branch}","tags_url":"https://api.github.com/repos/boostorg/spirit/tags","blobs_url":"https://api.github.com/repos/boostorg/spirit/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/boostorg/spirit/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/boostorg/spirit/git/refs{/sha}","trees_url":"https://api.github.com/repos/boostorg/spirit/git/trees{/sha}","statuses_url":"https://api.github.com/repos/boostorg/spirit/statuses/{sha}","languages_url":"https://api.github.com/repos/boostorg/spirit/languages","stargazers_url":"https://api.github.com/repos/boostorg/spirit/stargazers","contributors_url":"https://api.github.com/repos/boostorg/spirit/contributors","subscribers_url":"https://api.github.com/repos/boostorg/spirit/subscribers","subscription_url":"https://api.github.com/repos/boostorg/spirit/subscription","commits_url":"https://api.github.com/repos/boostorg/spirit/commits{/sha}","git_commits_url":"https://api.github.com/repos/boostorg/spirit/git/commits{/sha}","comments_url":"https://api.github.com/repos/boostorg/spirit/comments{/number}","issue_comment_url":"https://api.github.com/repos/boostorg/spirit/issues/comments/{number}","contents_url":"https://api.github.com/repos/boostorg/spirit/contents/{+path}","compare_url":"https://api.github.com/repos/boostorg/spirit/compare/{base}...{head}","merges_url":"https://api.github.com/repos/boostorg/spirit/merges","archive_url":"https://api.github.com/repos/boostorg/spirit/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/boostorg/spirit/downloads","issues_url":"https://api.github.com/repos/boostorg/spirit/issues{/number}","pulls_url":"https://api.github.com/repos/boostorg/spirit/pulls{/number}","milestones_url":"https://api.github.com/repos/boostorg/spirit/milestones{/number}","notifications_url":"https://api.github.com/repos/boostorg/spirit/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/boostorg/spirit/labels{/name}","releases_url":"https://api.github.com/repos/boostorg/spirit/releases{/id}","created_at":"2013-01-13T15:58:57Z","updated_at":"2014-06-11T14:41:31Z","pushed_at":"2014-06-11T14:41:31Z","git_url":"git://github.com/boostorg/spirit.git","ssh_url":"git@github.com:boostorg/spirit.git","clone_url":"https://github.com/boostorg/spirit.git","svn_url":"https://github.com/boostorg/spirit","homepage":"http://boost.org/libs/spirit","size":760538,"stargazers_count":17,"watchers_count":17,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"forks_count":20,"mirror_url":null,"open_issues_count":4,"forks":20,"open_issues":4,"watchers":17,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/boostorg/spirit/pulls/41"},"html":{"href":"https://github.com/boostorg/spirit/pull/41"},"issue":{"href":"https://api.github.com/repos/boostorg/spirit/issues/41"},"comments":{"href":"https://api.github.com/repos/boostorg/spirit/issues/41/comments"},"review_comments":{"href":"https://api.github.com/repos/boostorg/spirit/pulls/41/comments"},"review_comment":{"href":"https://api.github.com/repos/boostorg/spirit/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/boostorg/spirit/pulls/41/commits"},"statuses":{"href":"https://api.github.com/repos/boostorg/spirit/statuses/1845d50f95287b12c85aafea7ae48f6847df1406"}}}}