{"action":"created","comment":{"url":"https://api.github.com/repos/Microsoft/bond/pulls/comments/186909601","pull_request_review_id":118571518,"id":186909601,"diff_hunk":"@@ -37,308 +37,303 @@ use_value\n //\n // Nullable value\n //\n-template<typename T,\n-         typename Allocator = typename detail::allocator_type<T>::type,\n-         bool useValue = detail::use_value<T>::value>\n+template <\n+    typename T,\n+    typename Allocator = typename detail::allocator_type<T>::type,\n+    typename Enable = void>\n class nullable;\n \n-template<typename T, typename Allocator>\n-class nullable<T, Allocator, true>\n-    : Allocator\n+#if defined(_MSC_VER) && _MSC_VER < 1900\n+#pragma warning(push)\n+#pragma warning(disable: 4510)\n+#endif\n+template <typename T, typename Allocator>\n+class nullable<T, Allocator, typename boost::enable_if<detail::use_value<T> >::type>\n+    : private detail::allocator_holder<Allocator>\n {\n+    using alloc_holder = detail::allocator_holder<Allocator>;\n+\n public:\n-    typedef T           value_type;\n-    typedef T*          pointer;\n-    typedef const T*    const_pointer;\n-    typedef T&          reference;\n-    typedef const T&    const_reference;\n-    typedef Allocator   allocator_type;\n+    using value_type = T;\n+    using allocator_type = Allocator;\n \n-    bool hasvalue() const\n-    {\n-        return _hasvalue;\n-    }\n+    nullable() = default;\n+\n+    explicit\n+    nullable(const allocator_type& alloc)\n+        : alloc_holder(alloc)\n+    {}\n+\n+    nullable(const nullable& other) = default;\n \n-    bool empty() const\n+    nullable(const nullable& other, const allocator_type& alloc)\n+        : alloc_holder(alloc)\n     {\n-        return !hasvalue();\n+        if (other.hasvalue())\n+        {\n+            _value.emplace(*other._value, alloc);\n+        }\n     }\n \n-    void swap(nullable& src)\n+    nullable(nullable&& other) BOND_NOEXCEPT_IF(\n+            std::is_nothrow_move_constructible<alloc_holder>::value\n+            && std::is_nothrow_move_constructible<T>::value)\n+        : alloc_holder(std::move(other)),\n+          _value(std::move(other._value))\n     {\n-        std::swap(base(), src.base());\n-        std::swap(_hasvalue, src._hasvalue);\n-        std::swap(_value, src._value);\n+        other._value = boost::none; // assigning boost::none is noexcept\n     }\n \n-    nullable()\n-        : _value(),\n-          _hasvalue(false)\n-    {}\n-\n-    explicit\n-    nullable(const allocator_type& alloc)\n-        : Allocator(alloc),\n-          _value(make_value<value_type>()),\n-          _hasvalue(false)\n+    nullable(nullable&& other, const allocator_type& alloc)\n+        : alloc_holder(alloc),\n+          _value(std::move(other._value), alloc)\n     {\n+        other._value = boost::none; // assigning boost::none is noexcept\n     }\n \n     explicit\n-    nullable(const value_type& value)\n-        : Allocator(detail::get_allocator(value)),\n-          _value(value),\n-          _hasvalue(true)\n+    nullable(const T& value)\n+        : alloc_holder(detail::get_allocator(value)),\n+          _value(value)\n     {}\n \n-    nullable(const nullable& src)\n-        : Allocator(src.base()),\n-          _value(src._value),\n-          _hasvalue(src._hasvalue)\n+    explicit\n+    nullable(T&& value)\n+        : alloc_holder(detail::get_allocator(value)),\n+          _value(std::move(value))\n     {}\n \n-    nullable(const nullable& src, const allocator_type& alloc)\n-        : Allocator(alloc),\n-          _value(src._value, alloc),\n-          _hasvalue(src._hasvalue)\n-    {}\n+    nullable& operator=(const nullable& src) = default;\n \n-    nullable& operator=(const nullable& src)\n+    nullable& operator=(nullable&& other) BOND_NOEXCEPT_IF(\n+        std::is_nothrow_move_constructible<alloc_holder>::value\n+        && std::is_nothrow_move_constructible<T>::value)\n     {\n-        nullable(src).swap(*this);\n+        alloc_holder::operator=(std::move(other));\n+        _value = std::move(other._value);\n+        other._value = boost::none; // assigning boost::none is noexcept\n         return *this;\n     }\n \n-    reference value()\n+    bool hasvalue() const BOND_NOEXCEPT\n     {\n-        BOOST_ASSERT(hasvalue());\n-        return _value;\n+        return static_cast<bool>(_value);\n     }\n \n-    const_reference value() const\n+    bool empty() const BOND_NOEXCEPT\n     {\n-        BOOST_ASSERT(hasvalue());\n-        return _value;\n-    }\n-\n-    reference operator*()\n-    {\n-        return value();\n+        return !hasvalue();\n     }\n \n-    const_reference operator*() const\n+    explicit operator bool() const BOND_NOEXCEPT\n     {\n-        return value();\n+        return !empty();\n     }\n \n-    pointer operator->()\n+    T& value() BOND_NOEXCEPT\n     {\n-        return &value();\n+        BOOST_ASSERT(hasvalue());\n+        return *_value;\n     }\n \n-    const_pointer operator->() const\n+    const T& value() const BOND_NOEXCEPT\n     {\n-        return &value();\n+        BOOST_ASSERT(hasvalue());\n+        return *_value;\n     }\n \n-    bool operator!() const\n+    T& operator*() BOND_NOEXCEPT\n     {\n-        return empty();\n+        return value();\n     }\n \n-    reference set()\n+    const T& operator*() const BOND_NOEXCEPT\n     {\n-        _hasvalue = true;\n-        return _value;\n+        return value();\n     }\n \n-    void set(const_reference value)\n+    T* operator->() BOND_NOEXCEPT\n     {\n-        _value = value;\n-        _hasvalue = true;\n+        return &value();\n     }\n \n-    void reset()\n+    const T* operator->() const BOND_NOEXCEPT\n     {\n-        _value = make_value<value_type>();\n-        _hasvalue = false;\n+        return &value();\n     }\n \n-    void clear()\n+    T& set()\n     {\n-        reset();\n-    }\n+        if (empty())\n+            set_value();\n \n-    allocator_type get_allocator() const\n-    {\n-        return base();\n+        return *_value;\n     }\n \n-    explicit\n-    nullable(value_type&& value) BOND_NOEXCEPT_IF(\n-            std::is_nothrow_move_constructible<Allocator>::value\n-            && std::is_nothrow_move_constructible<value_type>::value)\n-        : Allocator(detail::get_allocator(value)),\n-          _value(std::move(value)),\n-          _hasvalue(true)\n-    {}\n-\n-    nullable(nullable&& src) BOND_NOEXCEPT_IF(\n-            std::is_nothrow_move_constructible<Allocator>::value\n-            && std::is_nothrow_move_constructible<value_type>::value)\n-        : Allocator(std::move(src.base())),\n-          _value(std::move(src._value)),\n-          _hasvalue(std::move(src._hasvalue))\n+    void set(const T& value) BOND_NOEXCEPT_IF(std::is_nothrow_copy_constructible<T>::value)\n     {\n-        src._hasvalue = false;\n+        _value = value;\n     }\n \n-    nullable(nullable&& src, const allocator_type& alloc)\n-        : Allocator(alloc),\n-          _value(std::move(src._value), alloc),\n-          _hasvalue(std::move(src._hasvalue))\n+    void set(T&& value) BOND_NOEXCEPT_IF(std::is_nothrow_move_constructible<T>::value)\n     {\n-        src._hasvalue = false;\n+        _value = std::move(value);\n     }\n \n-    nullable& operator=(nullable&& src) BOND_NOEXCEPT_IF(\n-        std::is_nothrow_move_constructible<Allocator>::value\n-        && std::is_nothrow_move_constructible<value_type>::value)\n+    void reset() BOND_NOEXCEPT\n     {\n-        if (this != &src)\n-        {\n-            base() = std::move(src.base());\n-            _value = std::move(src._value);\n-            _hasvalue = std::move(src._hasvalue);\n-            src._hasvalue = false;\n-        }\n-        return *this;\n+        _value = boost::none;\n     }\n \n-    void set(value_type&& value) BOND_NOEXCEPT_IF(\n-        std::is_nothrow_move_constructible<value_type>::value)\n+    void clear() BOND_NOEXCEPT\n     {\n-        _value = std::move(value);\n-        _hasvalue = true;\n+        reset();\n     }\n \n-private:\n-    Allocator& base()\n+    void swap(nullable& other)\n     {\n-        return static_cast<allocator_type&>(*this);\n+        using std::swap;\n+        swap(static_cast<alloc_holder&>(*this), static_cast<alloc_holder&>(other));\n+        swap(_value, other._value);\n     }\n \n-    const Allocator& base() const\n+    allocator_type get_allocator() const BOND_NOEXCEPT\n     {\n-        return static_cast<const allocator_type&>(*this);\n+        return alloc_holder::get();\n     }\n \n-    template<typename ValueType>\n-    typename boost::enable_if<detail::has_allocator<ValueType>, ValueType>::type\n-    make_value()\n+private:\n+    template <typename U = T>\n+    typename boost::enable_if<detail::has_allocator<U> >::type\n+    set_value()\n     {\n-        return ValueType(base());\n+        _value.emplace(alloc_holder::get());\n     }\n \n-    template<typename ValueType>\n-    typename boost::disable_if<detail::has_allocator<ValueType>, ValueType>::type\n-    make_value()\n+    template <typename U = T>\n+    typename boost::disable_if<detail::has_allocator<U> >::type\n+    set_value()\n     {\n-        return ValueType();\n+        _value.emplace();\n     }\n \n-private:\n-    value_type  _value;\n-    bool        _hasvalue;\n+    boost::optional<T> _value;\n };\n+#if defined(_MSC_VER) && _MSC_VER < 1900\n+#pragma warning(pop)\n+#endif\n \n \n /** @brief Nullable type */\n /** See [User's Manual](../../manual/bond_cpp.html#nullable-types) */\n-template<typename T, typename Allocator>\n-class nullable<T, Allocator, false>\n-    : Allocator\n+template <typename T, typename Allocator>\n+class nullable<T, Allocator, typename boost::disable_if<detail::use_value<T> >::type>\n+    : private detail::allocator_holder<Allocator>\n {\n-    BOOST_STATIC_ASSERT(!detail::use_value<T>::value);\n+    using alloc_holder = detail::allocator_holder<Allocator>;\n+    using rebind_alloc = typename std::allocator_traits<Allocator>::template rebind_alloc<T>;\n+    using pointer = typename std::allocator_traits<rebind_alloc>::pointer;\n \n public:\n-    typedef T           value_type;\n-    typedef T*          pointer;\n-    typedef const T*    const_pointer;\n-    typedef T&          reference;\n-    typedef const T&    const_reference;\n-    typedef Allocator   allocator_type;\n-\n-private:\n-    typedef typename std::allocator_traits<allocator_type>::template rebind_alloc<value_type> rebind_alloc;\n-\n-    typedef typename std::allocator_traits<rebind_alloc>::pointer real_pointer;\n-\n-public:\n-    bool hasvalue() const\n-    {\n-        return !!_value;\n-    }\n-\n-    /// @brief Checks if the object is null\n-    bool empty() const\n-    {\n-        return !hasvalue();\n-    }\n-\n-    void swap(nullable& src)\n-    {\n-        std::swap(base(), src.base());\n-        std::swap(_value, src._value);\n-    }\n+    using value_type = T;\n+    using allocator_type = Allocator;\n \n     /// @brief Default constructor\n-    nullable()\n-        : _value()\n+    nullable() BOND_NOEXCEPT_IF(\n+        std::is_nothrow_default_constructible<alloc_holder>::value\n+        && std::is_nothrow_default_constructible<pointer>::value)\n+        : alloc_holder(),\n+          _value()\n     {}\n \n     /// @brief Construct nullable using specified allocator instance\n     explicit\n     nullable(const allocator_type& alloc)\n-        : Allocator(alloc),\n+        : alloc_holder(alloc),\n           _value()\n     {}\n \n+    /// @brief Copy constructor\n+    nullable(const nullable& other)\n+        : alloc_holder(other),\n+          _value(other.hasvalue() ? new_value(other.value()) : pointer())\n+    {}\n+\n+    nullable(const nullable& other, const allocator_type& alloc)\n+        : alloc_holder(alloc),\n+          _value(other.hasvalue() ? new_value(other.value(), alloc) : pointer())\n+    {}\n+\n+    nullable(nullable&& other) BOND_NOEXCEPT_IF(\n+            std::is_nothrow_move_constructible<alloc_holder>::value\n+            && std::is_nothrow_move_constructible<pointer>::value\n+            && BOND_NOEXCEPT(other._value = {}))\n+        : alloc_holder(std::move(other)),\n+          _value(std::move(other._value))\n+    {\n+        other._value = {};\n+    }\n+\n+    nullable(nullable&& other, const allocator_type& alloc)\n+        : alloc_holder(alloc),\n+          _value(other.alloc_holder::get() == alloc\n+              ? std::move(other._value)\n+              : (other.hasvalue() ? new_value(std::move(*other._value), alloc) : pointer()))\n+    {\n+        other._value = {};\n+    }\n+\n     /// @brief Construct from an instance T\n     explicit\n-    nullable(const value_type& value,\n-             const allocator_type& alloc = allocator_type())\n-        : Allocator(alloc),\n+    nullable(const T& value, const allocator_type& alloc = {})\n+        : alloc_holder(alloc),\n           _value(new_value(value))\n     {}\n \n-    /// @brief Copy constructor\n-    nullable(const nullable& src)\n-        : Allocator(src.base()),\n-          _value(src.hasvalue() ? new_value(src.value()) : real_pointer())\n+    explicit\n+    nullable(T&& value, const allocator_type& alloc = {})\n+        : alloc_holder(alloc),\n+          _value(new_value(std::move(value)))\n     {}\n \n-    nullable(const nullable& src, const allocator_type& alloc)\n-        : Allocator(alloc),\n-          _value(src.hasvalue() ? new_value(src.value(), alloc) : real_pointer())\n-    {}\n+    /// @brief Assignment operator\n+    nullable& operator=(const nullable& other)\n+    {\n+        nullable(other).swap(*this);\n+        return *this;\n+    }\n+\n+    nullable& operator=(nullable&& other)\n+    {\n+        nullable(std::move(other)).swap(*this);\n+        return *this;\n+    }\n \n     ~nullable()\n     {\n         reset();\n     }\n \n-    /// @brief Assignment operator\n-    nullable& operator=(const nullable& src)\n+    bool hasvalue() const BOND_NOEXCEPT\n     {\n-        nullable(src).swap(*this);\n-        return *this;\n+        return !!_value;","path":"cpp/inc/bond/core/nullable.h","position":484,"original_position":484,"commit_id":"e18baaec42d3b06ed88cd6f35debb485a01e357e","original_commit_id":"e18baaec42d3b06ed88cd6f35debb485a01e357e","user":{"login":"chwarr","id":10605667,"avatar_url":"https://avatars3.githubusercontent.com/u/10605667?v=4","gravatar_id":"","url":"https://api.github.com/users/chwarr","html_url":"https://github.com/chwarr","followers_url":"https://api.github.com/users/chwarr/followers","following_url":"https://api.github.com/users/chwarr/following{/other_user}","gists_url":"https://api.github.com/users/chwarr/gists{/gist_id}","starred_url":"https://api.github.com/users/chwarr/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/chwarr/subscriptions","organizations_url":"https://api.github.com/users/chwarr/orgs","repos_url":"https://api.github.com/users/chwarr/repos","events_url":"https://api.github.com/users/chwarr/events{/privacy}","received_events_url":"https://api.github.com/users/chwarr/received_events","type":"User","site_admin":false},"body":"Is the `!!` idiom to handle custom `pointer` types that don't have an `explicit operator bool`?","created_at":"2018-05-09T01:18:21Z","updated_at":"2018-05-09T01:27:56Z","html_url":"https://github.com/Microsoft/bond/pull/871#discussion_r186909601","pull_request_url":"https://api.github.com/repos/Microsoft/bond/pulls/871","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/Microsoft/bond/pulls/comments/186909601"},"html":{"href":"https://github.com/Microsoft/bond/pull/871#discussion_r186909601"},"pull_request":{"href":"https://api.github.com/repos/Microsoft/bond/pulls/871"}}},"pull_request":{"url":"https://api.github.com/repos/Microsoft/bond/pulls/871","id":186514094,"html_url":"https://github.com/Microsoft/bond/pull/871","diff_url":"https://github.com/Microsoft/bond/pull/871.diff","patch_url":"https://github.com/Microsoft/bond/pull/871.patch","issue_url":"https://api.github.com/repos/Microsoft/bond/issues/871","number":871,"state":"open","locked":false,"title":"[c++] Refactor nullable<T>","user":{"login":"ara-ayvazyan","id":25734498,"avatar_url":"https://avatars1.githubusercontent.com/u/25734498?v=4","gravatar_id":"","url":"https://api.github.com/users/ara-ayvazyan","html_url":"https://github.com/ara-ayvazyan","followers_url":"https://api.github.com/users/ara-ayvazyan/followers","following_url":"https://api.github.com/users/ara-ayvazyan/following{/other_user}","gists_url":"https://api.github.com/users/ara-ayvazyan/gists{/gist_id}","starred_url":"https://api.github.com/users/ara-ayvazyan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ara-ayvazyan/subscriptions","organizations_url":"https://api.github.com/users/ara-ayvazyan/orgs","repos_url":"https://api.github.com/users/ara-ayvazyan/repos","events_url":"https://api.github.com/users/ara-ayvazyan/events{/privacy}","received_events_url":"https://api.github.com/users/ara-ayvazyan/received_events","type":"User","site_admin":false},"body":"- Remove the `useValue` type argument in order to avoid unintentional use.\r\n- Remove unnecessary typedefs (`reference`, `pointer`, etc.).\r\n- Use `boost::optional<T>`.\r\n- Use `detail::allocator_holder<A>`.","created_at":"2018-05-08T02:54:17Z","updated_at":"2018-05-09T01:27:56Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3d344809cf2efc3cc309e828eb7c03dc69354083","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/Microsoft/bond/pulls/871/commits","review_comments_url":"https://api.github.com/repos/Microsoft/bond/pulls/871/comments","review_comment_url":"https://api.github.com/repos/Microsoft/bond/pulls/comments{/number}","comments_url":"https://api.github.com/repos/Microsoft/bond/issues/871/comments","statuses_url":"https://api.github.com/repos/Microsoft/bond/statuses/e18baaec42d3b06ed88cd6f35debb485a01e357e","head":{"label":"ara-ayvazyan:refactor_nullable","ref":"refactor_nullable","sha":"e18baaec42d3b06ed88cd6f35debb485a01e357e","user":{"login":"ara-ayvazyan","id":25734498,"avatar_url":"https://avatars1.githubusercontent.com/u/25734498?v=4","gravatar_id":"","url":"https://api.github.com/users/ara-ayvazyan","html_url":"https://github.com/ara-ayvazyan","followers_url":"https://api.github.com/users/ara-ayvazyan/followers","following_url":"https://api.github.com/users/ara-ayvazyan/following{/other_user}","gists_url":"https://api.github.com/users/ara-ayvazyan/gists{/gist_id}","starred_url":"https://api.github.com/users/ara-ayvazyan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ara-ayvazyan/subscriptions","organizations_url":"https://api.github.com/users/ara-ayvazyan/orgs","repos_url":"https://api.github.com/users/ara-ayvazyan/repos","events_url":"https://api.github.com/users/ara-ayvazyan/events{/privacy}","received_events_url":"https://api.github.com/users/ara-ayvazyan/received_events","type":"User","site_admin":false},"repo":{"id":87358176,"name":"bond","full_name":"ara-ayvazyan/bond","owner":{"login":"ara-ayvazyan","id":25734498,"avatar_url":"https://avatars1.githubusercontent.com/u/25734498?v=4","gravatar_id":"","url":"https://api.github.com/users/ara-ayvazyan","html_url":"https://github.com/ara-ayvazyan","followers_url":"https://api.github.com/users/ara-ayvazyan/followers","following_url":"https://api.github.com/users/ara-ayvazyan/following{/other_user}","gists_url":"https://api.github.com/users/ara-ayvazyan/gists{/gist_id}","starred_url":"https://api.github.com/users/ara-ayvazyan/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ara-ayvazyan/subscriptions","organizations_url":"https://api.github.com/users/ara-ayvazyan/orgs","repos_url":"https://api.github.com/users/ara-ayvazyan/repos","events_url":"https://api.github.com/users/ara-ayvazyan/events{/privacy}","received_events_url":"https://api.github.com/users/ara-ayvazyan/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/ara-ayvazyan/bond","description":"Bond is a cross-platform framework for working with schematized data. It supports cross-language de/serialization and powerful generic mechanisms for efficiently manipulating data. Bond is broadly used at Microsoft in high scale services. ","fork":true,"url":"https://api.github.com/repos/ara-ayvazyan/bond","forks_url":"https://api.github.com/repos/ara-ayvazyan/bond/forks","keys_url":"https://api.github.com/repos/ara-ayvazyan/bond/keys{/key_id}","collaborators_url":"https://api.github.com/repos/ara-ayvazyan/bond/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/ara-ayvazyan/bond/teams","hooks_url":"https://api.github.com/repos/ara-ayvazyan/bond/hooks","issue_events_url":"https://api.github.com/repos/ara-ayvazyan/bond/issues/events{/number}","events_url":"https://api.github.com/repos/ara-ayvazyan/bond/events","assignees_url":"https://api.github.com/repos/ara-ayvazyan/bond/assignees{/user}","branches_url":"https://api.github.com/repos/ara-ayvazyan/bond/branches{/branch}","tags_url":"https://api.github.com/repos/ara-ayvazyan/bond/tags","blobs_url":"https://api.github.com/repos/ara-ayvazyan/bond/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/ara-ayvazyan/bond/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/ara-ayvazyan/bond/git/refs{/sha}","trees_url":"https://api.github.com/repos/ara-ayvazyan/bond/git/trees{/sha}","statuses_url":"https://api.github.com/repos/ara-ayvazyan/bond/statuses/{sha}","languages_url":"https://api.github.com/repos/ara-ayvazyan/bond/languages","stargazers_url":"https://api.github.com/repos/ara-ayvazyan/bond/stargazers","contributors_url":"https://api.github.com/repos/ara-ayvazyan/bond/contributors","subscribers_url":"https://api.github.com/repos/ara-ayvazyan/bond/subscribers","subscription_url":"https://api.github.com/repos/ara-ayvazyan/bond/subscription","commits_url":"https://api.github.com/repos/ara-ayvazyan/bond/commits{/sha}","git_commits_url":"https://api.github.com/repos/ara-ayvazyan/bond/git/commits{/sha}","comments_url":"https://api.github.com/repos/ara-ayvazyan/bond/comments{/number}","issue_comment_url":"https://api.github.com/repos/ara-ayvazyan/bond/issues/comments{/number}","contents_url":"https://api.github.com/repos/ara-ayvazyan/bond/contents/{+path}","compare_url":"https://api.github.com/repos/ara-ayvazyan/bond/compare/{base}...{head}","merges_url":"https://api.github.com/repos/ara-ayvazyan/bond/merges","archive_url":"https://api.github.com/repos/ara-ayvazyan/bond/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/ara-ayvazyan/bond/downloads","issues_url":"https://api.github.com/repos/ara-ayvazyan/bond/issues{/number}","pulls_url":"https://api.github.com/repos/ara-ayvazyan/bond/pulls{/number}","milestones_url":"https://api.github.com/repos/ara-ayvazyan/bond/milestones{/number}","notifications_url":"https://api.github.com/repos/ara-ayvazyan/bond/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/ara-ayvazyan/bond/labels{/name}","releases_url":"https://api.github.com/repos/ara-ayvazyan/bond/releases{/id}","deployments_url":"https://api.github.com/repos/ara-ayvazyan/bond/deployments","created_at":"2017-04-05T21:28:06Z","updated_at":"2018-05-01T21:25:42Z","pushed_at":"2018-05-09T00:27:30Z","git_url":"git://github.com/ara-ayvazyan/bond.git","ssh_url":"git@github.com:ara-ayvazyan/bond.git","clone_url":"https://github.com/ara-ayvazyan/bond.git","svn_url":"https://github.com/ara-ayvazyan/bond","homepage":null,"size":9965,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"Microsoft:master","ref":"master","sha":"73f1861e0ae4b92822d78f0a013057dae84b5d1e","user":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars2.githubusercontent.com/u/6154722?v=4","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"repo":{"id":28014525,"name":"bond","full_name":"Microsoft/bond","owner":{"login":"Microsoft","id":6154722,"avatar_url":"https://avatars2.githubusercontent.com/u/6154722?v=4","gravatar_id":"","url":"https://api.github.com/users/Microsoft","html_url":"https://github.com/Microsoft","followers_url":"https://api.github.com/users/Microsoft/followers","following_url":"https://api.github.com/users/Microsoft/following{/other_user}","gists_url":"https://api.github.com/users/Microsoft/gists{/gist_id}","starred_url":"https://api.github.com/users/Microsoft/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Microsoft/subscriptions","organizations_url":"https://api.github.com/users/Microsoft/orgs","repos_url":"https://api.github.com/users/Microsoft/repos","events_url":"https://api.github.com/users/Microsoft/events{/privacy}","received_events_url":"https://api.github.com/users/Microsoft/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/Microsoft/bond","description":"Bond is a cross-platform framework for working with schematized data. It supports cross-language de/serialization and powerful generic mechanisms for efficiently manipulating data. Bond is broadly used at Microsoft in high scale services. ","fork":false,"url":"https://api.github.com/repos/Microsoft/bond","forks_url":"https://api.github.com/repos/Microsoft/bond/forks","keys_url":"https://api.github.com/repos/Microsoft/bond/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Microsoft/bond/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Microsoft/bond/teams","hooks_url":"https://api.github.com/repos/Microsoft/bond/hooks","issue_events_url":"https://api.github.com/repos/Microsoft/bond/issues/events{/number}","events_url":"https://api.github.com/repos/Microsoft/bond/events","assignees_url":"https://api.github.com/repos/Microsoft/bond/assignees{/user}","branches_url":"https://api.github.com/repos/Microsoft/bond/branches{/branch}","tags_url":"https://api.github.com/repos/Microsoft/bond/tags","blobs_url":"https://api.github.com/repos/Microsoft/bond/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Microsoft/bond/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Microsoft/bond/git/refs{/sha}","trees_url":"https://api.github.com/repos/Microsoft/bond/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Microsoft/bond/statuses/{sha}","languages_url":"https://api.github.com/repos/Microsoft/bond/languages","stargazers_url":"https://api.github.com/repos/Microsoft/bond/stargazers","contributors_url":"https://api.github.com/repos/Microsoft/bond/contributors","subscribers_url":"https://api.github.com/repos/Microsoft/bond/subscribers","subscription_url":"https://api.github.com/repos/Microsoft/bond/subscription","commits_url":"https://api.github.com/repos/Microsoft/bond/commits{/sha}","git_commits_url":"https://api.github.com/repos/Microsoft/bond/git/commits{/sha}","comments_url":"https://api.github.com/repos/Microsoft/bond/comments{/number}","issue_comment_url":"https://api.github.com/repos/Microsoft/bond/issues/comments{/number}","contents_url":"https://api.github.com/repos/Microsoft/bond/contents/{+path}","compare_url":"https://api.github.com/repos/Microsoft/bond/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Microsoft/bond/merges","archive_url":"https://api.github.com/repos/Microsoft/bond/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Microsoft/bond/downloads","issues_url":"https://api.github.com/repos/Microsoft/bond/issues{/number}","pulls_url":"https://api.github.com/repos/Microsoft/bond/pulls{/number}","milestones_url":"https://api.github.com/repos/Microsoft/bond/milestones{/number}","notifications_url":"https://api.github.com/repos/Microsoft/bond/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Microsoft/bond/labels{/name}","releases_url":"https://api.github.com/repos/Microsoft/bond/releases{/id}","deployments_url":"https://api.github.com/repos/Microsoft/bond/deployments","created_at":"2014-12-15T01:05:31Z","updated_at":"2018-05-08T12:31:46Z","pushed_at":"2018-05-09T00:27:31Z","git_url":"git://github.com/Microsoft/bond.git","ssh_url":"git@github.com:Microsoft/bond.git","clone_url":"https://github.com/Microsoft/bond.git","svn_url":"https://github.com/Microsoft/bond","homepage":null,"size":13191,"stargazers_count":1718,"watchers_count":1718,"language":"C++","has_issues":true,"has_projects":false,"has_downloads":true,"has_wiki":false,"has_pages":true,"forks_count":234,"mirror_url":null,"archived":false,"open_issues_count":133,"license":{"key":"mit","name":"MIT License","spdx_id":"MIT","url":"https://api.github.com/licenses/mit"},"forks":234,"open_issues":133,"watchers":1718,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/Microsoft/bond/pulls/871"},"html":{"href":"https://github.com/Microsoft/bond/pull/871"},"issue":{"href":"https://api.github.com/repos/Microsoft/bond/issues/871"},"comments":{"href":"https://api.github.com/repos/Microsoft/bond/issues/871/comments"},"review_comments":{"href":"https://api.github.com/repos/Microsoft/bond/pulls/871/comments"},"review_comment":{"href":"https://api.github.com/repos/Microsoft/bond/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/Microsoft/bond/pulls/871/commits"},"statuses":{"href":"https://api.github.com/repos/Microsoft/bond/statuses/e18baaec42d3b06ed88cd6f35debb485a01e357e"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"chwarr"}}