GitHub PullRequestReviewCommentEvent at 2014-08-22 12:43:59
Repository: rust
Actor: pczarn
Payload: {"action":"created","comment":{"url":"https://api.github.com/repos/rust-lang/rust/pulls/comments/16595362","id":16595362,"diff_hunk":"@@ -0,0 +1,888 @@\n+// Copyright 2014 The Rust Project Developers. See the COPYRIGHT\n+// file at the top-level directory of this distribution and at\n+// http://rust-lang.org/COPYRIGHT.\n+//\n+// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or\n+// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license\n+// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your\n+// option. This file may not be copied, modified, or distributed\n+// except according to those terms.\n+//\n+// ignore-lexer-test FIXME #15883\n+\n+use clone::Clone;\n+use cmp;\n+use hash::{Hash, Hasher};\n+use iter::{Iterator, count};\n+use mem::{min_align_of, size_of};\n+use mem;\n+use num::{CheckedAdd, CheckedMul, is_power_of_two};\n+use ops::{Deref, DerefMut, Drop};\n+use option::{Some, None, Option};\n+use ptr::{RawPtr, copy_nonoverlapping_memory, set_memory};\n+use ptr;\n+use rt::heap::{allocate, deallocate};\n+\n+static EMPTY_BUCKET: u64 = 0u64;\n+\n+/// The raw hashtable, providing safe-ish access to the unzipped and highly\n+/// optimized arrays of hashes, keys, and values.\n+///\n+/// This design uses less memory and is a lot faster than the naive\n+/// `Vec<Option<u64, K, V>>`, because we don't pay for the overhead of an\n+/// option on every element, and we get a generally more cache-aware design.\n+///\n+/// Essential invariants of this structure:\n+///\n+///   - if t.hashes[i] == EMPTY_BUCKET, then `Bucket::at_index(&t, i).raw`\n+///     points to 'undefined' contents. Don't read from it. This invariant is\n+///     enforced outside this module with the `EmptyBucket`, `FullBucket`,\n+///     and `SafeHash` types.\n+///\n+///   - An `EmptyBucket` is only constructed at an index with\n+///     a hash of EMPTY_BUCKET.\n+///\n+///   - A `FullBucket` is only constructed at an index with a\n+///     non-EMPTY_BUCKET hash.\n+///\n+///   - A `SafeHash` is only constructed for non-`EMPTY_BUCKET` hash. We get\n+///     around hashes of zero by changing them to 0x8000_0000_0000_0000,\n+///     which will likely map to the same bucket, while not being confused\n+///     with \"empty\".\n+///\n+///   - All three \"arrays represented by pointers\" are the same length:\n+///     `capacity`. This is set at creation and never changes. The arrays\n+///     are unzipped to save space (we don't have to pay for the padding\n+///     between odd sized elements, such as in a map from u64 to u8), and\n+///     be more cache aware (scanning through 8 hashes brings in at most\n+///     2 cache lines, since they're all right beside each other).\n+///\n+/// You can kind of think of this module/data structure as a safe wrapper\n+/// around just the \"table\" part of the hashtable. It enforces some\n+/// invariants at the type level and employs some performance trickery,\n+/// but in general is just a tricked out `Vec<Option<u64, K, V>>`.\n+#[unsafe_no_drop_flag]\n+pub struct RawTable<K, V> {\n+    capacity: uint,\n+    size:     uint,\n+    hashes:   *mut u64\n+}\n+\n+struct RawBucket<K, V> {\n+    hash: *mut u64,\n+    key:  *mut K,\n+    val:  *mut V\n+}\n+\n+pub struct Bucket<K, V, M> {\n+    raw:   RawBucket<K, V>,\n+    idx:   uint,\n+    table: M\n+}\n+\n+pub struct EmptyBucket<K, V, M> {\n+    raw:   RawBucket<K, V>,\n+    idx:   uint,\n+    table: M\n+}\n+\n+pub struct FullBucket<K, V, M> {\n+    raw:   RawBucket<K, V>,\n+    idx:   uint,\n+    table: M\n+}\n+\n+pub type EmptyBucketImm<'table, K, V> = EmptyBucket<K, V, &'table RawTable<K, V>>;\n+pub type  FullBucketImm<'table, K, V> =  FullBucket<K, V, &'table RawTable<K, V>>;\n+\n+pub type EmptyBucketMut<'table, K, V> = EmptyBucket<K, V, &'table mut RawTable<K, V>>;\n+pub type  FullBucketMut<'table, K, V> =  FullBucket<K, V, &'table mut RawTable<K, V>>;\n+\n+pub enum BucketState<K, V, M> {\n+    Empty(EmptyBucket<K, V, M>),\n+    Full(FullBucket<K, V, M>),\n+}\n+\n+// A GapThenFull encapsulates the state of two consecutive buckets at once.\n+// The first bucket, called the gap, is known to be empty.\n+// The second bucket is full.\n+struct GapThenFull<K, V, M> {\n+    gap: EmptyBucket<K, V, ()>,\n+    full: FullBucket<K, V, M>\n+}\n+\n+\n+impl<K, V> RawBucket<K, V> {\n+    unsafe fn offset(self, count: int) -> RawBucket<K, V> {\n+        RawBucket {\n+            hash: self.hash.offset(count),\n+            key:  self.key.offset(count),\n+            val:  self.val.offset(count),\n+        }\n+    }\n+}\n+\n+// For parameterizing over mutability.\n+impl<'t, K, V> Deref<RawTable<K, V>> for &'t RawTable<K, V> {\n+    fn deref<'a>(&'a self) -> &'a RawTable<K,V> {\n+        &**self\n+    }\n+}\n+\n+impl<'t, K, V> Deref<RawTable<K, V>> for &'t mut RawTable<K, V> {\n+    fn deref<'a>(&'a self) -> &'a RawTable<K,V> {\n+        &**self\n+    }\n+}\n+\n+impl<'t, K, V> DerefMut<RawTable<K, V>> for &'t mut RawTable<K, V> {\n+    fn deref_mut<'a>(&'a mut self) -> &'a mut RawTable<K,V> {\n+        &mut **self\n+    }\n+}\n+\n+/// A bucket that holds a reference to the table\n+pub trait BucketWithTable<M> {\n+    /// Borrow a reference to the table.\n+    fn table<'a>(&'a self) -> &'a M;\n+\n+    /// Move out the reference to the table.\n+    fn into_table(self) -> M;\n+\n+    /// Get the raw index.\n+    fn index(&self) -> uint;\n+}\n+\n+impl<K, V, M> BucketWithTable<M> for FullBucket<K, V, M> {\n+    fn table<'a>(&'a self) -> &'a M {\n+        &self.table\n+    }\n+\n+    fn into_table(self) -> M {\n+        self.table\n+    }\n+\n+    fn index(&self) -> uint {\n+        self.idx\n+    }\n+}\n+\n+impl<K, V, M> BucketWithTable<M> for EmptyBucket<K, V, M> {\n+    fn table<'a>(&'a self) -> &'a M {\n+        &self.table\n+    }\n+\n+    fn into_table(self) -> M {\n+        self.table\n+    }\n+\n+    fn index(&self) -> uint {\n+        self.idx\n+    }\n+}\n+\n+impl<K, V, M> BucketWithTable<M> for Bucket<K, V, M> {\n+    fn table<'a>(&'a self) -> &'a M {\n+        &self.table\n+    }\n+\n+    fn into_table(self) -> M {\n+        self.table\n+    }\n+\n+    fn index(&self) -> uint {\n+        self.idx\n+    }\n+}\n+\n+impl<K, V, M: Deref<RawTable<K, V>>> Bucket<K, V, M> {\n+    pub fn new(table: M, hash: &SafeHash) -> Bucket<K, V, M> {\n+        Bucket::at_index(table, hash.inspect() as uint)\n+    }\n+\n+    pub fn at_index(table: M, ib_index: uint) -> Bucket<K, V, M> {\n+        let ib_index = ib_index & (table.capacity() - 1);\n+        Bucket {\n+            raw: unsafe {\n+               table.first_bucket_raw().offset(ib_index as int)\n+            },\n+            idx: ib_index,\n+            table: table\n+        }\n+    }\n+\n+    pub fn first(table: M) -> Bucket<K, V, M> {\n+        Bucket {\n+            raw: table.first_bucket_raw(),\n+            idx: 0,\n+            table: table\n+        }\n+    }\n+\n+    /// Reads a bucket at a given index, returning an enum indicating whether\n+    /// it's initialized or not. You need to match on this enum to get\n+    /// the appropriate types to call most of the other functions in\n+    /// this module.\n+    pub fn peek(self) -> BucketState<K, V, M> {\n+        match unsafe { *self.raw.hash } {\n+            EMPTY_BUCKET =>\n+                Empty(EmptyBucket {\n+                    raw: self.raw,\n+                    idx: self.idx,\n+                    table: self.table\n+                }),\n+            _ =>\n+                Full(FullBucket {\n+                    raw: self.raw,\n+                    idx: self.idx,\n+                    table: self.table\n+                })\n+        }\n+    }\n+\n+    /// Modifies the bucket pointer in place to make it point to the next slot.\n+    pub fn next(&mut self) {\n+        // Branchless bucket iteration step.\n+        // As we reach the end of the table...\n+        // We take the current idx:          0111111b\n+        // Xor it by its increment:        ^ 1000000b\n+        //                               ------------\n+        //                                   1111111b\n+        // Then AND with the capacity:     & 1000000b\n+        //                               ------------\n+        // to get the backwards offset:      1000000b\n+        // ... and it's zero at all other times.\n+        let maybe_wraparound_dist = (self.idx ^ (self.idx + 1)) & self.table.capacity();\n+        // Finally, we obtain the offset 1 or the offset -cap + 1.\n+        let dist = 1i - (maybe_wraparound_dist as int);\n+\n+        self.idx += 1;\n+\n+        unsafe {\n+            self.raw = self.raw.offset(dist);\n+        }\n+    }\n+}\n+\n+impl<K, V, M: Deref<RawTable<K, V>>> EmptyBucket<K, V, M> {\n+    #[inline]\n+    pub fn next(self) -> Bucket<K, V, M> {\n+        let mut bucket = self.into_bucket();\n+        bucket.next();\n+        bucket\n+    }\n+\n+    #[inline]\n+    pub fn into_bucket(self) -> Bucket<K, V, M> {\n+        Bucket {\n+            raw: self.raw,\n+            idx: self.idx,\n+            table: self.table\n+        }\n+    }\n+\n+    pub fn gap_peek(self) -> Option<GapThenFull<K, V, M>> {\n+        let gap = EmptyBucket {\n+            raw: self.raw,\n+            idx: self.idx,\n+            table: ()\n+        };\n+\n+        match self.next().peek() {\n+            Full(bucket) => {\n+                Some(GapThenFull {\n+                    gap: gap,\n+                    full: bucket\n+                })\n+            }\n+            Empty(..) => None\n+        }\n+    }\n+}\n+\n+impl<K, V, M: DerefMut<RawTable<K, V>>> EmptyBucket<K, V, M> {\n+    /// Puts this bucket's key and value pair, along with the key's hash,\n+    /// into a given index in the hashtable. Note how `self` is 'moved' into\n+    /// this function, because this slot will no longer be empty when\n+    /// we return! A `FullBucket` is returned for later use, pointing to\n+    /// the newly-filled slot in the hashtable.\n+    ///\n+    /// Use `make_hash` to construct a `SafeHash` to pass to this function.\n+    pub fn put(mut self, hash: SafeHash, key: K, value: V)\n+               -> FullBucket<K, V, M> {\n+        unsafe {\n+            *self.raw.hash = hash.inspect();\n+            ptr::write(self.raw.key, key);\n+            ptr::write(self.raw.val, value);\n+        }\n+\n+        self.table.size += 1;\n+\n+        FullBucket { raw: self.raw, idx: self.idx, table: self.table }\n+    }\n+}\n+\n+impl<K, V, M: Deref<RawTable<K, V>>> FullBucket<K, V, M> {\n+    #[inline]\n+    pub fn next(self) -> Bucket<K, V, M> {\n+        let mut bucket = self.into_bucket();\n+        bucket.next();\n+        bucket\n+    }\n+\n+    #[inline]\n+    pub fn into_bucket(self) -> Bucket<K, V, M> {\n+        Bucket {\n+            raw: self.raw,\n+            idx: self.idx,\n+            table: self.table\n+        }\n+    }\n+\n+    /// Get the distance of the bucket that it lies from its 'ideal' location.\n+    ///\n+    /// In the cited blog posts above, this is called the \"distance to\n+    /// initial bucket\", or DIB. Also known as \"probe count\".\n+    pub fn distance(&self) -> uint {\n+        (self.idx - self.hash().inspect() as uint) & (self.table.capacity() - 1)","path":"src/libstd/collections/hashmap/table.rs","position":347,"original_position":347,"commit_id":"2b0140b51cf1d203ae38a601004af66ccfbb18ea","original_commit_id":"2b0140b51cf1d203ae38a601004af66ccfbb18ea","user":{"login":"pczarn","id":3356767,"avatar_url":"https://avatars.githubusercontent.com/u/3356767?v=2","gravatar_id":"263ec107ea95c0df1c3d107f96ec079e","url":"https://api.github.com/users/pczarn","html_url":"https://github.com/pczarn","followers_url":"https://api.github.com/users/pczarn/followers","following_url":"https://api.github.com/users/pczarn/following{/other_user}","gists_url":"https://api.github.com/users/pczarn/gists{/gist_id}","starred_url":"https://api.github.com/users/pczarn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pczarn/subscriptions","organizations_url":"https://api.github.com/users/pczarn/orgs","repos_url":"https://api.github.com/users/pczarn/repos","events_url":"https://api.github.com/users/pczarn/events{/privacy}","received_events_url":"https://api.github.com/users/pczarn/received_events","type":"User","site_admin":false},"body":"Yes, it takes only `log_2(capacity)` least significant bits of both idx and hash into consideration. Unsigned under/overflow doesn't matter since `capacity < uint::MAX+1`. It's basically `(idx - hash) mod capacity`.","created_at":"2014-08-22T12:43:59Z","updated_at":"2014-08-22T12:43:59Z","html_url":"https://github.com/rust-lang/rust/pull/16628#discussion_r16595362","pull_request_url":"https://api.github.com/repos/rust-lang/rust/pulls/16628","_links":{"self":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/comments/16595362"},"html":{"href":"https://github.com/rust-lang/rust/pull/16628#discussion_r16595362"},"pull_request":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/16628"}}},"pull_request":{"url":"https://api.github.com/repos/rust-lang/rust/pulls/16628","id":20049452,"html_url":"https://github.com/rust-lang/rust/pull/16628","diff_url":"https://github.com/rust-lang/rust/pull/16628.diff","patch_url":"https://github.com/rust-lang/rust/pull/16628.patch","issue_url":"https://api.github.com/repos/rust-lang/rust/issues/16628","number":16628,"state":"open","locked":false,"title":"Optimized HashMap. RawTable exposes a safe interface. (reopen)","user":{"login":"pczarn","id":3356767,"avatar_url":"https://avatars.githubusercontent.com/u/3356767?v=2","gravatar_id":"263ec107ea95c0df1c3d107f96ec079e","url":"https://api.github.com/users/pczarn","html_url":"https://github.com/pczarn","followers_url":"https://api.github.com/users/pczarn/followers","following_url":"https://api.github.com/users/pczarn/following{/other_user}","gists_url":"https://api.github.com/users/pczarn/gists{/gist_id}","starred_url":"https://api.github.com/users/pczarn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pczarn/subscriptions","organizations_url":"https://api.github.com/users/pczarn/orgs","repos_url":"https://api.github.com/users/pczarn/repos","events_url":"https://api.github.com/users/pczarn/events{/privacy}","received_events_url":"https://api.github.com/users/pczarn/received_events","type":"User","site_admin":false},"body":"This is #15720, rebased and reopened.\r\n\r\ncc @nikomatsakis","created_at":"2014-08-20T14:47:42Z","updated_at":"2014-08-22T12:43:59Z","closed_at":null,"merged_at":null,"merge_commit_sha":"57cc1d2c23e8bda777dd699c007c0376cf28fc4f","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/rust-lang/rust/pulls/16628/commits","review_comments_url":"https://api.github.com/repos/rust-lang/rust/pulls/16628/comments","review_comment_url":"https://api.github.com/repos/rust-lang/rust/pulls/comments/{number}","comments_url":"https://api.github.com/repos/rust-lang/rust/issues/16628/comments","statuses_url":"https://api.github.com/repos/rust-lang/rust/statuses/2b0140b51cf1d203ae38a601004af66ccfbb18ea","head":{"label":"pczarn:hashmap-opt","ref":"hashmap-opt","sha":"2b0140b51cf1d203ae38a601004af66ccfbb18ea","user":{"login":"pczarn","id":3356767,"avatar_url":"https://avatars.githubusercontent.com/u/3356767?v=2","gravatar_id":"263ec107ea95c0df1c3d107f96ec079e","url":"https://api.github.com/users/pczarn","html_url":"https://github.com/pczarn","followers_url":"https://api.github.com/users/pczarn/followers","following_url":"https://api.github.com/users/pczarn/following{/other_user}","gists_url":"https://api.github.com/users/pczarn/gists{/gist_id}","starred_url":"https://api.github.com/users/pczarn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pczarn/subscriptions","organizations_url":"https://api.github.com/users/pczarn/orgs","repos_url":"https://api.github.com/users/pczarn/repos","events_url":"https://api.github.com/users/pczarn/events{/privacy}","received_events_url":"https://api.github.com/users/pczarn/received_events","type":"User","site_admin":false},"repo":{"id":17574759,"name":"rust","full_name":"pczarn/rust","owner":{"login":"pczarn","id":3356767,"avatar_url":"https://avatars.githubusercontent.com/u/3356767?v=2","gravatar_id":"263ec107ea95c0df1c3d107f96ec079e","url":"https://api.github.com/users/pczarn","html_url":"https://github.com/pczarn","followers_url":"https://api.github.com/users/pczarn/followers","following_url":"https://api.github.com/users/pczarn/following{/other_user}","gists_url":"https://api.github.com/users/pczarn/gists{/gist_id}","starred_url":"https://api.github.com/users/pczarn/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/pczarn/subscriptions","organizations_url":"https://api.github.com/users/pczarn/orgs","repos_url":"https://api.github.com/users/pczarn/repos","events_url":"https://api.github.com/users/pczarn/events{/privacy}","received_events_url":"https://api.github.com/users/pczarn/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/pczarn/rust","description":"a safe, concurrent, practical language","fork":true,"url":"https://api.github.com/repos/pczarn/rust","forks_url":"https://api.github.com/repos/pczarn/rust/forks","keys_url":"https://api.github.com/repos/pczarn/rust/keys{/key_id}","collaborators_url":"https://api.github.com/repos/pczarn/rust/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/pczarn/rust/teams","hooks_url":"https://api.github.com/repos/pczarn/rust/hooks","issue_events_url":"https://api.github.com/repos/pczarn/rust/issues/events{/number}","events_url":"https://api.github.com/repos/pczarn/rust/events","assignees_url":"https://api.github.com/repos/pczarn/rust/assignees{/user}","branches_url":"https://api.github.com/repos/pczarn/rust/branches{/branch}","tags_url":"https://api.github.com/repos/pczarn/rust/tags","blobs_url":"https://api.github.com/repos/pczarn/rust/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/pczarn/rust/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/pczarn/rust/git/refs{/sha}","trees_url":"https://api.github.com/repos/pczarn/rust/git/trees{/sha}","statuses_url":"https://api.github.com/repos/pczarn/rust/statuses/{sha}","languages_url":"https://api.github.com/repos/pczarn/rust/languages","stargazers_url":"https://api.github.com/repos/pczarn/rust/stargazers","contributors_url":"https://api.github.com/repos/pczarn/rust/contributors","subscribers_url":"https://api.github.com/repos/pczarn/rust/subscribers","subscription_url":"https://api.github.com/repos/pczarn/rust/subscription","commits_url":"https://api.github.com/repos/pczarn/rust/commits{/sha}","git_commits_url":"https://api.github.com/repos/pczarn/rust/git/commits{/sha}","comments_url":"https://api.github.com/repos/pczarn/rust/comments{/number}","issue_comment_url":"https://api.github.com/repos/pczarn/rust/issues/comments/{number}","contents_url":"https://api.github.com/repos/pczarn/rust/contents/{+path}","compare_url":"https://api.github.com/repos/pczarn/rust/compare/{base}...{head}","merges_url":"https://api.github.com/repos/pczarn/rust/merges","archive_url":"https://api.github.com/repos/pczarn/rust/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/pczarn/rust/downloads","issues_url":"https://api.github.com/repos/pczarn/rust/issues{/number}","pulls_url":"https://api.github.com/repos/pczarn/rust/pulls{/number}","milestones_url":"https://api.github.com/repos/pczarn/rust/milestones{/number}","notifications_url":"https://api.github.com/repos/pczarn/rust/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/pczarn/rust/labels{/name}","releases_url":"https://api.github.com/repos/pczarn/rust/releases{/id}","created_at":"2014-03-09T22:00:17Z","updated_at":"2014-07-25T23:29:16Z","pushed_at":"2014-08-21T20:18:45Z","git_url":"git://github.com/pczarn/rust.git","ssh_url":"git@github.com:pczarn/rust.git","clone_url":"https://github.com/pczarn/rust.git","svn_url":"https://github.com/pczarn/rust","homepage":"http://www.rust-lang.org","size":152918,"stargazers_count":0,"watchers_count":0,"language":"Rust","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":"master"}},"base":{"label":"rust-lang:master","ref":"master","sha":"cb5967e002dc33671f687b957ba8ae46a9de66fb","user":{"login":"rust-lang","id":5430905,"avatar_url":"https://avatars.githubusercontent.com/u/5430905?v=2","gravatar_id":"a4268b59e433144466a0f67cbcfd8cdc","url":"https://api.github.com/users/rust-lang","html_url":"https://github.com/rust-lang","followers_url":"https://api.github.com/users/rust-lang/followers","following_url":"https://api.github.com/users/rust-lang/following{/other_user}","gists_url":"https://api.github.com/users/rust-lang/gists{/gist_id}","starred_url":"https://api.github.com/users/rust-lang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rust-lang/subscriptions","organizations_url":"https://api.github.com/users/rust-lang/orgs","repos_url":"https://api.github.com/users/rust-lang/repos","events_url":"https://api.github.com/users/rust-lang/events{/privacy}","received_events_url":"https://api.github.com/users/rust-lang/received_events","type":"Organization","site_admin":false},"repo":{"id":724712,"name":"rust","full_name":"rust-lang/rust","owner":{"login":"rust-lang","id":5430905,"avatar_url":"https://avatars.githubusercontent.com/u/5430905?v=2","gravatar_id":"a4268b59e433144466a0f67cbcfd8cdc","url":"https://api.github.com/users/rust-lang","html_url":"https://github.com/rust-lang","followers_url":"https://api.github.com/users/rust-lang/followers","following_url":"https://api.github.com/users/rust-lang/following{/other_user}","gists_url":"https://api.github.com/users/rust-lang/gists{/gist_id}","starred_url":"https://api.github.com/users/rust-lang/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/rust-lang/subscriptions","organizations_url":"https://api.github.com/users/rust-lang/orgs","repos_url":"https://api.github.com/users/rust-lang/repos","events_url":"https://api.github.com/users/rust-lang/events{/privacy}","received_events_url":"https://api.github.com/users/rust-lang/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/rust-lang/rust","description":"a safe, concurrent, practical language","fork":false,"url":"https://api.github.com/repos/rust-lang/rust","forks_url":"https://api.github.com/repos/rust-lang/rust/forks","keys_url":"https://api.github.com/repos/rust-lang/rust/keys{/key_id}","collaborators_url":"https://api.github.com/repos/rust-lang/rust/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/rust-lang/rust/teams","hooks_url":"https://api.github.com/repos/rust-lang/rust/hooks","issue_events_url":"https://api.github.com/repos/rust-lang/rust/issues/events{/number}","events_url":"https://api.github.com/repos/rust-lang/rust/events","assignees_url":"https://api.github.com/repos/rust-lang/rust/assignees{/user}","branches_url":"https://api.github.com/repos/rust-lang/rust/branches{/branch}","tags_url":"https://api.github.com/repos/rust-lang/rust/tags","blobs_url":"https://api.github.com/repos/rust-lang/rust/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/rust-lang/rust/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/rust-lang/rust/git/refs{/sha}","trees_url":"https://api.github.com/repos/rust-lang/rust/git/trees{/sha}","statuses_url":"https://api.github.com/repos/rust-lang/rust/statuses/{sha}","languages_url":"https://api.github.com/repos/rust-lang/rust/languages","stargazers_url":"https://api.github.com/repos/rust-lang/rust/stargazers","contributors_url":"https://api.github.com/repos/rust-lang/rust/contributors","subscribers_url":"https://api.github.com/repos/rust-lang/rust/subscribers","subscription_url":"https://api.github.com/repos/rust-lang/rust/subscription","commits_url":"https://api.github.com/repos/rust-lang/rust/commits{/sha}","git_commits_url":"https://api.github.com/repos/rust-lang/rust/git/commits{/sha}","comments_url":"https://api.github.com/repos/rust-lang/rust/comments{/number}","issue_comment_url":"https://api.github.com/repos/rust-lang/rust/issues/comments/{number}","contents_url":"https://api.github.com/repos/rust-lang/rust/contents/{+path}","compare_url":"https://api.github.com/repos/rust-lang/rust/compare/{base}...{head}","merges_url":"https://api.github.com/repos/rust-lang/rust/merges","archive_url":"https://api.github.com/repos/rust-lang/rust/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/rust-lang/rust/downloads","issues_url":"https://api.github.com/repos/rust-lang/rust/issues{/number}","pulls_url":"https://api.github.com/repos/rust-lang/rust/pulls{/number}","milestones_url":"https://api.github.com/repos/rust-lang/rust/milestones{/number}","notifications_url":"https://api.github.com/repos/rust-lang/rust/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/rust-lang/rust/labels{/name}","releases_url":"https://api.github.com/repos/rust-lang/rust/releases{/id}","created_at":"2010-06-16T20:39:03Z","updated_at":"2014-08-22T12:37:14Z","pushed_at":"2014-08-22T11:50:58Z","git_url":"git://github.com/rust-lang/rust.git","ssh_url":"git@github.com:rust-lang/rust.git","clone_url":"https://github.com/rust-lang/rust.git","svn_url":"https://github.com/rust-lang/rust","homepage":"http://www.rust-lang.org","size":439073,"stargazers_count":6129,"watchers_count":6129,"language":"Rust","has_issues":true,"has_downloads":true,"has_wiki":true,"forks_count":1226,"mirror_url":null,"open_issues_count":1838,"forks":1226,"open_issues":1838,"watchers":6129,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/16628"},"html":{"href":"https://github.com/rust-lang/rust/pull/16628"},"issue":{"href":"https://api.github.com/repos/rust-lang/rust/issues/16628"},"comments":{"href":"https://api.github.com/repos/rust-lang/rust/issues/16628/comments"},"review_comments":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/16628/comments"},"review_comment":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/comments/{number}"},"commits":{"href":"https://api.github.com/repos/rust-lang/rust/pulls/16628/commits"},"statuses":{"href":"https://api.github.com/repos/rust-lang/rust/statuses/2b0140b51cf1d203ae38a601004af66ccfbb18ea"}}}}