mirror of
https://github.com/mozilla/gecko-dev.git
synced 2024-10-07 18:04:46 +00:00
Bug 1449087 part 1 - Upgrade cssparser to 0.23.4 for serialization fix. r=emilio
MozReview-Commit-ID: IJ2OqSjn1NM --HG-- rename : third_party/rust/itoa/performance.png => third_party/rust/itoa-0.3.1/performance.png extra : rebase_source : 8d8107fed692d8e8be1933cc2e993a389ce4d595 extra : source : 8be60db7102b905572b80aab931631153023d532
This commit is contained in:
parent
3698b17162
commit
07cf23d1df
29
Cargo.lock
generated
29
Cargo.lock
generated
@ -361,18 +361,19 @@ dependencies = [
|
||||
|
||||
[[package]]
|
||||
name = "cssparser"
|
||||
version = "0.23.2"
|
||||
version = "0.23.4"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
dependencies = [
|
||||
"cssparser-macros 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"dtoa-short 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"phf 0.7.21 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"proc-macro2 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"procedural-masquerade 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 0.3.15 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"quote 0.4.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"smallvec 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.11.11 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"syn 0.12.12 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@ -698,7 +699,7 @@ name = "geckoservo"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cssparser 0.23.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cssparser 0.23.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cstr 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"env_logger 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"libc 0.2.39 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -856,6 +857,11 @@ name = "itoa"
|
||||
version = "0.3.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "itoa"
|
||||
version = "0.4.1"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
|
||||
[[package]]
|
||||
name = "js"
|
||||
version = "0.1.4"
|
||||
@ -963,7 +969,7 @@ name = "malloc_size_of"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"app_units 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cssparser 0.23.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cssparser 0.23.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"euclid 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"hashglobe 0.1.0",
|
||||
"selectors 0.19.0",
|
||||
@ -1542,7 +1548,7 @@ name = "selectors"
|
||||
version = "0.19.0"
|
||||
dependencies = [
|
||||
"bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cssparser 0.23.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cssparser 0.23.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"fnv 1.0.5 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"log 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"matches 0.1.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -1652,7 +1658,7 @@ dependencies = [
|
||||
"bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"byteorder 1.2.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cfg-if 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cssparser 0.23.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cssparser 0.23.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"debug_unreachable 0.1.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"euclid 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"fallible 0.0.1",
|
||||
@ -1707,7 +1713,7 @@ version = "0.0.1"
|
||||
dependencies = [
|
||||
"app_units 0.6.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"bitflags 1.0.1 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cssparser 0.23.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cssparser 0.23.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"euclid 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"malloc_size_of 0.0.1",
|
||||
"malloc_size_of_derive 0.0.1",
|
||||
@ -1720,7 +1726,7 @@ name = "stylo_tests"
|
||||
version = "0.0.1"
|
||||
dependencies = [
|
||||
"atomic_refcell 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cssparser 0.23.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cssparser 0.23.4 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"cstr 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"env_logger 0.5.6 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
"euclid 0.17.2 (registry+https://github.com/rust-lang/crates.io-index)",
|
||||
@ -2254,7 +2260,7 @@ dependencies = [
|
||||
"checksum crossbeam-deque 0.2.0 (registry+https://github.com/rust-lang/crates.io-index)" = "f739f8c5363aca78cfb059edf753d8f0d36908c348f3d8d1503f03d8b75d9cf3"
|
||||
"checksum crossbeam-epoch 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "927121f5407de9956180ff5e936fe3cf4324279280001cd56b669d28ee7e9150"
|
||||
"checksum crossbeam-utils 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "2760899e32a1d58d5abb31129f8fae5de75220bc2176e77ff7c627ae45c918d9"
|
||||
"checksum cssparser 0.23.2 (registry+https://github.com/rust-lang/crates.io-index)" = "8a807ac3ab7a217829c2a3b65732b926b2befe6a35f33b4bf8b503692430f223"
|
||||
"checksum cssparser 0.23.4 (registry+https://github.com/rust-lang/crates.io-index)" = "b906ac3f6108d8d0bfd4158469abe5909df1497116c8400346b5e08944579edd"
|
||||
"checksum cssparser-macros 0.3.0 (registry+https://github.com/rust-lang/crates.io-index)" = "079adec4af52bb5275eadd004292028c79eb3c5f5b4ee8086a36d4197032f6df"
|
||||
"checksum cstr 0.1.3 (registry+https://github.com/rust-lang/crates.io-index)" = "b6557bdb1dc9647eae1cf7f5601b14cd45fc3c7ccf2df618387416fe542da6ea"
|
||||
"checksum cstr-macros 0.1.2 (registry+https://github.com/rust-lang/crates.io-index)" = "f9f316203d1ea36f4f18316822806f6999aa3dc5ed1adf51e35b77e3b3933d78"
|
||||
@ -2299,6 +2305,7 @@ dependencies = [
|
||||
"checksum iovec 0.1.0 (registry+https://github.com/rust-lang/crates.io-index)" = "29d062ee61fccdf25be172e70f34c9f6efc597e1fb8f6526e8437b2046ab26be"
|
||||
"checksum itertools 0.7.6 (registry+https://github.com/rust-lang/crates.io-index)" = "b07332223953b5051bceb67e8c4700aa65291535568e1f12408c43c4a42c0394"
|
||||
"checksum itoa 0.3.1 (registry+https://github.com/rust-lang/crates.io-index)" = "eb2f404fbc66fd9aac13e998248505e7ecb2ad8e44ab6388684c5fb11c6c251c"
|
||||
"checksum itoa 0.4.1 (registry+https://github.com/rust-lang/crates.io-index)" = "c069bbec61e1ca5a596166e55dfe4773ff745c3d16b700013bcaff9a6df2c682"
|
||||
"checksum kernel32-sys 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "7507624b29483431c0ba2d82aece8ca6cdba9382bff4ddd0f7490560c056098d"
|
||||
"checksum khronos_api 2.0.0 (registry+https://github.com/rust-lang/crates.io-index)" = "d867c645cfeb8a7fec503731679eac03ac11b7105aa5a71cb8f8ee5271636add"
|
||||
"checksum language-tags 0.2.2 (registry+https://github.com/rust-lang/crates.io-index)" = "a91d884b6667cd606bb5a69aa0c99ba811a115fc68915e7056ec08a46e93199a"
|
||||
|
@ -1 +1 @@
|
||||
{"files":{".travis.yml":"f1fb4b65964c81bc1240544267ea334f554ca38ae7a74d57066f4d47d2b5d568","Cargo.toml":"7807f16d417eb1a6ede56cd4ba2da6c5c63e4530289b3f0848f4b154e18eba02","LICENSE":"fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85","README.md":"c5781e673335f37ed3d7acb119f8ed33efdf6eb75a7094b7da2abe0c3230adb8","build.rs":"b29fc57747f79914d1c2fb541e2bb15a003028bb62751dcb901081ccc174b119","build/match_byte.rs":"2c84b8ca5884347d2007f49aecbd85b4c7582085526e2704399817249996e19b","docs/.nojekyll":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","docs/404.html":"025861f76f8d1f6d67c20ab624c6e418f4f824385e2dd8ad8732c4ea563c6a2e","docs/index.html":"025861f76f8d1f6d67c20ab624c6e418f4f824385e2dd8ad8732c4ea563c6a2e","src/color.rs":"c60f1b0ab7a2a6213e434604ee33f78e7ef74347f325d86d0b9192d8225ae1cc","src/cow_rc_str.rs":"541216f8ef74ee3cc5cbbc1347e5f32ed66588c401851c9a7d68b867aede1de0","src/from_bytes.rs":"331fe63af2123ae3675b61928a69461b5ac77799fff3ce9978c55cf2c558f4ff","src/lib.rs":"46c377e0c9a75780d5cb0bcf4dfb960f0fb2a996a13e7349bb111b9082252233","src/macros.rs":"adb9773c157890381556ea83d7942dcc676f99eea71abbb6afeffee1e3f28960","src/nth.rs":"5c70fb542d1376cddab69922eeb4c05e4fcf8f413f27563a2af50f72a47c8f8c","src/parser.rs":"9ed4aec998221eb2d2ba99db2f9f82a02399fb0c3b8500627f68f5aab872adde","src/rules_and_declarations.rs":"be2c4f3f3bb673d866575b6cb6084f1879dff07356d583ca9a3595f63b7f916f","src/serializer.rs":"4ccfc9b4fe994aab3803662bbf31cc25052a6a39531073a867b14b224afe42dd","src/size_of_tests.rs":"e5f63c8c18721cc3ff7a5407e84f9889ffa10e66da96e8510a696c3e00ad72d5","src/tests.rs":"80b02c80ab0fd580dad9206615c918e0db7dff63dfed0feeedb66f317d24b24b","src/tokenizer.rs":"429b2cba419cf8b923fbcc32d3bd34c0b39284ebfcb9fc29b8eb8643d8d5f312","src/unicode_range.rs":"c1c4ed2493e09d248c526ce1ef8575a5f8258da3962b64ffc814ef3bdf9780d0"},"package":"8a807ac3ab7a217829c2a3b65732b926b2befe6a35f33b4bf8b503692430f223"}
|
||||
{"files":{".travis.yml":"e8f586288c39dbaebefdd391f68376e58f3a4c568a8dc3cd97c4a362194716dd","Cargo.toml":"efd6f23ab6df0f7bffa3b56a166aff55aa5d082fa4084ba3f443e86833e783e1","LICENSE":"fab3dd6bdab226f1c08630b1dd917e11fcb4ec5e1e020e2c16f83a0a13863e85","README.md":"c5781e673335f37ed3d7acb119f8ed33efdf6eb75a7094b7da2abe0c3230adb8","build.rs":"1068e899b617cf99eee953f745d83f88859cc0cef0297fcc3310b6bd24474761","build/match_byte.rs":"0f7d39170e746d59deebf7894086f63ee39ea61fb161d24b0c7a3c1db3945e0d","docs/.nojekyll":"e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855","docs/404.html":"025861f76f8d1f6d67c20ab624c6e418f4f824385e2dd8ad8732c4ea563c6a2e","docs/index.html":"025861f76f8d1f6d67c20ab624c6e418f4f824385e2dd8ad8732c4ea563c6a2e","src/color.rs":"c60f1b0ab7a2a6213e434604ee33f78e7ef74347f325d86d0b9192d8225ae1cc","src/cow_rc_str.rs":"541216f8ef74ee3cc5cbbc1347e5f32ed66588c401851c9a7d68b867aede1de0","src/from_bytes.rs":"331fe63af2123ae3675b61928a69461b5ac77799fff3ce9978c55cf2c558f4ff","src/lib.rs":"46c377e0c9a75780d5cb0bcf4dfb960f0fb2a996a13e7349bb111b9082252233","src/macros.rs":"adb9773c157890381556ea83d7942dcc676f99eea71abbb6afeffee1e3f28960","src/nth.rs":"5c70fb542d1376cddab69922eeb4c05e4fcf8f413f27563a2af50f72a47c8f8c","src/parser.rs":"9ed4aec998221eb2d2ba99db2f9f82a02399fb0c3b8500627f68f5aab872adde","src/rules_and_declarations.rs":"be2c4f3f3bb673d866575b6cb6084f1879dff07356d583ca9a3595f63b7f916f","src/serializer.rs":"4ccfc9b4fe994aab3803662bbf31cc25052a6a39531073a867b14b224afe42dd","src/size_of_tests.rs":"e5f63c8c18721cc3ff7a5407e84f9889ffa10e66da96e8510a696c3e00ad72d5","src/tests.rs":"80b02c80ab0fd580dad9206615c918e0db7dff63dfed0feeedb66f317d24b24b","src/tokenizer.rs":"429b2cba419cf8b923fbcc32d3bd34c0b39284ebfcb9fc29b8eb8643d8d5f312","src/unicode_range.rs":"191d50a1588e5c88608b84cfe9279def71f495f8e016fa093f90399bbd2b635f"},"package":"b906ac3f6108d8d0bfd4158469abe5909df1497116c8400346b5e08944579edd"}
|
1
third_party/rust/cssparser/.travis.yml
vendored
1
third_party/rust/cssparser/.travis.yml
vendored
@ -12,6 +12,7 @@ script:
|
||||
- cargo test --features dummy_match_byte
|
||||
- if [ "$TRAVIS_RUST_VERSION" == "nightly" ]; then cargo test --features bench; fi
|
||||
- if [ "$TRAVIS_RUST_VERSION" == "nightly" ]; then cargo test --features "bench dummy_match_byte"; fi
|
||||
- cd macros && cargo build --verbose
|
||||
|
||||
notifications:
|
||||
webhooks: http://build.servo.org:54856/travis
|
||||
|
14
third_party/rust/cssparser/Cargo.toml
vendored
14
third_party/rust/cssparser/Cargo.toml
vendored
@ -12,7 +12,7 @@
|
||||
|
||||
[package]
|
||||
name = "cssparser"
|
||||
version = "0.23.2"
|
||||
version = "0.23.4"
|
||||
authors = ["Simon Sapin <simon.sapin@exyr.org>"]
|
||||
build = "build.rs"
|
||||
exclude = ["src/css-parsing-tests/**", "src/big-data-url.css"]
|
||||
@ -33,7 +33,7 @@ version = ">= 0.3, < 0.5"
|
||||
optional = true
|
||||
|
||||
[dependencies.itoa]
|
||||
version = "0.3"
|
||||
version = "0.4"
|
||||
|
||||
[dependencies.matches]
|
||||
version = "0.1"
|
||||
@ -51,18 +51,22 @@ optional = true
|
||||
[dependencies.smallvec]
|
||||
version = "0.6"
|
||||
[dev-dependencies.difference]
|
||||
version = "1.0"
|
||||
version = "2.0"
|
||||
|
||||
[dev-dependencies.encoding_rs]
|
||||
version = "0.7"
|
||||
|
||||
[dev-dependencies.rustc-serialize]
|
||||
version = "0.3"
|
||||
[build-dependencies.proc-macro2]
|
||||
version = "0.2"
|
||||
|
||||
[build-dependencies.quote]
|
||||
version = "0.3"
|
||||
version = "0.4.1"
|
||||
|
||||
[build-dependencies.syn]
|
||||
version = "0.11"
|
||||
version = "0.12"
|
||||
features = ["extra-traits", "fold"]
|
||||
|
||||
[features]
|
||||
bench = []
|
||||
|
3
third_party/rust/cssparser/build.rs
vendored
3
third_party/rust/cssparser/build.rs
vendored
@ -2,8 +2,11 @@
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
#[macro_use]
|
||||
extern crate quote;
|
||||
#[macro_use]
|
||||
extern crate syn;
|
||||
extern crate proc_macro2;
|
||||
|
||||
use std::env;
|
||||
use std::path::Path;
|
||||
|
361
third_party/rust/cssparser/build/match_byte.rs
vendored
361
third_party/rust/cssparser/build/match_byte.rs
vendored
@ -2,83 +2,63 @@
|
||||
* License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
|
||||
|
||||
use quote::{ToTokens, Tokens};
|
||||
use quote::ToTokens;
|
||||
use std::fs::File;
|
||||
use std::io::{Read, Write};
|
||||
use std::path::Path;
|
||||
use std::vec;
|
||||
use std::iter;
|
||||
use syn;
|
||||
use syn::fold::Fold;
|
||||
|
||||
use proc_macro2::TokenStream;
|
||||
|
||||
struct MatchByteParser {
|
||||
}
|
||||
|
||||
pub fn expand(from: &Path, to: &Path) {
|
||||
let mut source = String::new();
|
||||
File::open(from).unwrap().read_to_string(&mut source).unwrap();
|
||||
let tts = syn::parse_token_trees(&source).expect("Parsing rules.rs module");
|
||||
let mut tokens = Tokens::new();
|
||||
tokens.append_all(expand_tts(tts));
|
||||
let ast = syn::parse_file(&source).expect("Parsing rules.rs module");
|
||||
let mut m = MatchByteParser {};
|
||||
let ast = m.fold_file(ast);
|
||||
|
||||
let code = tokens.to_string().replace("{ ", "{\n").replace(" }", "\n}");
|
||||
let code = ast.into_tokens().to_string().replace("{ ", "{\n").replace(" }", "\n}");
|
||||
File::create(to).unwrap().write_all(code.as_bytes()).unwrap();
|
||||
}
|
||||
|
||||
fn expand_tts(tts: Vec<syn::TokenTree>) -> Vec<syn::TokenTree> {
|
||||
use syn::*;
|
||||
let mut expanded = Vec::new();
|
||||
let mut tts = tts.into_iter();
|
||||
while let Some(tt) = tts.next() {
|
||||
match tt {
|
||||
TokenTree::Token(Token::Ident(ident)) => {
|
||||
if ident != "match_byte" {
|
||||
expanded.push(TokenTree::Token(Token::Ident(ident)));
|
||||
continue;
|
||||
}
|
||||
|
||||
match tts.next() {
|
||||
Some(TokenTree::Token(Token::Not)) => {},
|
||||
other => {
|
||||
expanded.push(TokenTree::Token(Token::Ident(ident)));
|
||||
if let Some(other) = other {
|
||||
expanded.push(other);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
let tts = match tts.next() {
|
||||
Some(TokenTree::Delimited(Delimited { tts, .. })) => tts,
|
||||
other => {
|
||||
expanded.push(TokenTree::Token(Token::Ident(ident)));
|
||||
expanded.push(TokenTree::Token(Token::Not));
|
||||
if let Some(other) = other {
|
||||
expanded.push(other);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
};
|
||||
|
||||
let (to_be_matched, table, cases, wildcard_binding) = parse_match_bytes_macro(tts);
|
||||
let expr = expand_match_bytes_macro(to_be_matched,
|
||||
&table,
|
||||
cases,
|
||||
wildcard_binding);
|
||||
|
||||
let tts = syn::parse_token_trees(&expr)
|
||||
.expect("parsing macro expansion as token trees");
|
||||
expanded.extend(expand_tts(tts));
|
||||
}
|
||||
TokenTree::Delimited(Delimited { delim, tts }) => {
|
||||
expanded.push(TokenTree::Delimited(Delimited {
|
||||
delim: delim,
|
||||
tts: expand_tts(tts),
|
||||
}))
|
||||
}
|
||||
other => expanded.push(other),
|
||||
}
|
||||
}
|
||||
expanded
|
||||
struct MatchByte {
|
||||
expr: syn::Expr,
|
||||
arms: Vec<syn::Arm>,
|
||||
}
|
||||
|
||||
/// Parses a token tree corresponding to the `match_byte` macro.
|
||||
impl syn::synom::Synom for MatchByte {
|
||||
named!(parse -> Self, do_parse!(
|
||||
expr: syn!(syn::Expr) >>
|
||||
punct!(,) >>
|
||||
arms: many0!(syn!(syn::Arm)) >> (
|
||||
MatchByte {
|
||||
expr,
|
||||
arms
|
||||
}
|
||||
)
|
||||
));
|
||||
}
|
||||
|
||||
fn get_byte_from_expr_lit(expr: &Box<syn::Expr>) -> u8 {
|
||||
match **expr {
|
||||
syn::Expr::Lit(syn::ExprLit { ref lit, .. }) => {
|
||||
if let syn::Lit::Byte(ref byte) = *lit {
|
||||
byte.value()
|
||||
}
|
||||
else {
|
||||
panic!("Found a pattern that wasn't a byte")
|
||||
}
|
||||
},
|
||||
_ => unreachable!(),
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/// Expand a TokenStream corresponding to the `match_byte` macro.
|
||||
///
|
||||
/// ## Example
|
||||
///
|
||||
@ -88,184 +68,111 @@ fn expand_tts(tts: Vec<syn::TokenTree>) -> Vec<syn::TokenTree> {
|
||||
/// b'0'..b'9' => { ... }
|
||||
/// b'\n' | b'\\' => { ... }
|
||||
/// foo => { ... }
|
||||
/// }
|
||||
/// }
|
||||
/// ```
|
||||
///
|
||||
/// Returns:
|
||||
/// * The token tree that contains the expression to be matched (in this case
|
||||
/// `tokenizer.next_byte_unchecked()`.
|
||||
///
|
||||
/// * The table with the different cases per byte, each entry in the table
|
||||
/// contains a non-zero integer representing a different arm of the
|
||||
/// match expression.
|
||||
///
|
||||
/// * The list of cases containing the expansion of the arms of the match
|
||||
/// expression.
|
||||
///
|
||||
/// * An optional identifier to which the wildcard pattern is matched (`foo` in
|
||||
/// this case).
|
||||
///
|
||||
fn parse_match_bytes_macro(tts: Vec<syn::TokenTree>) -> (Vec<syn::TokenTree>, [u8; 256], Vec<Case>, Option<syn::Ident>) {
|
||||
let mut tts = tts.into_iter();
|
||||
|
||||
// Grab the thing we're matching, until we find a comma.
|
||||
let mut left_hand_side = vec![];
|
||||
loop {
|
||||
match tts.next() {
|
||||
Some(syn::TokenTree::Token(syn::Token::Comma)) => break,
|
||||
Some(other) => left_hand_side.push(other),
|
||||
None => panic!("Expected not to run out of tokens looking for a comma"),
|
||||
}
|
||||
}
|
||||
|
||||
let mut cases = vec![];
|
||||
fn expand_match_byte(body: &TokenStream) -> syn::Expr {
|
||||
let match_byte: MatchByte = syn::parse2(body.clone()).unwrap();
|
||||
let expr = match_byte.expr;
|
||||
let mut cases = Vec::new();
|
||||
let mut table = [0u8; 256];
|
||||
let mut match_body = Vec::new();
|
||||
let mut wildcard = None;
|
||||
|
||||
let mut tts = tts.peekable();
|
||||
let mut case_id: u8 = 1;
|
||||
let mut binding = None;
|
||||
while tts.len() > 0 {
|
||||
cases.push(parse_case(&mut tts, &mut table, &mut binding, case_id));
|
||||
for (i, ref arm) in match_byte.arms.iter().enumerate() {
|
||||
let case_id = i + 1;
|
||||
let index = case_id as isize;
|
||||
let name = syn::Ident::from(format!("Case{}", case_id));
|
||||
|
||||
// Allow an optional comma between cases.
|
||||
match tts.peek() {
|
||||
Some(&syn::TokenTree::Token(syn::Token::Comma)) => {
|
||||
tts.next();
|
||||
},
|
||||
_ => {},
|
||||
}
|
||||
|
||||
case_id += 1;
|
||||
}
|
||||
|
||||
(left_hand_side, table, cases, binding)
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
struct Case(Vec<syn::TokenTree>);
|
||||
|
||||
/// Parses a single pattern => expression, and returns the case, filling in the
|
||||
/// table with the case id for every byte that matched.
|
||||
///
|
||||
/// The `binding` parameter is the identifier that is used by the wildcard
|
||||
/// pattern.
|
||||
fn parse_case(tts: &mut iter::Peekable<vec::IntoIter<syn::TokenTree>>,
|
||||
table: &mut [u8; 256],
|
||||
binding: &mut Option<syn::Ident>,
|
||||
case_id: u8)
|
||||
-> Case {
|
||||
// The last byte checked, as part of this pattern, to properly detect
|
||||
// ranges.
|
||||
let mut last_byte: Option<u8> = None;
|
||||
|
||||
// Loop through the pattern filling with bytes the table.
|
||||
loop {
|
||||
match tts.next() {
|
||||
Some(syn::TokenTree::Token(syn::Token::Literal(syn::Lit::Byte(byte)))) => {
|
||||
table[byte as usize] = case_id;
|
||||
last_byte = Some(byte);
|
||||
}
|
||||
Some(syn::TokenTree::Token(syn::Token::BinOp(syn::BinOpToken::Or))) => {
|
||||
last_byte = None; // This pattern is over.
|
||||
},
|
||||
Some(syn::TokenTree::Token(syn::Token::DotDotDot)) => {
|
||||
assert!(last_byte.is_some(), "Expected closed range!");
|
||||
match tts.next() {
|
||||
Some(syn::TokenTree::Token(syn::Token::Literal(syn::Lit::Byte(byte)))) => {
|
||||
for b in last_byte.take().unwrap()..byte {
|
||||
if table[b as usize] == 0 {
|
||||
table[b as usize] = case_id;
|
||||
}
|
||||
}
|
||||
if table[byte as usize] == 0 {
|
||||
table[byte as usize] = case_id;
|
||||
for pat in &arm.pats {
|
||||
match pat {
|
||||
&syn::Pat::Lit(syn::PatLit{ref expr}) => {
|
||||
let value = get_byte_from_expr_lit(expr);
|
||||
if table[value as usize] == 0 {
|
||||
table[value as usize] = case_id as u8;
|
||||
}
|
||||
},
|
||||
&syn::Pat::Range(syn::PatRange { ref lo, ref hi, .. }) => {
|
||||
let lo = get_byte_from_expr_lit(lo);
|
||||
let hi = get_byte_from_expr_lit(hi);
|
||||
for value in lo..hi {
|
||||
if table[value as usize] == 0 {
|
||||
table[value as usize] = case_id as u8;
|
||||
}
|
||||
}
|
||||
other => panic!("Expected closed range, got: {:?}", other),
|
||||
}
|
||||
},
|
||||
Some(syn::TokenTree::Token(syn::Token::FatArrow)) => break,
|
||||
Some(syn::TokenTree::Token(syn::Token::Ident(ident))) => {
|
||||
assert_eq!(last_byte, None, "I don't support ranges with identifiers!");
|
||||
assert_eq!(*binding, None);
|
||||
for byte in table.iter_mut() {
|
||||
if *byte == 0 {
|
||||
*byte = case_id;
|
||||
if table[hi as usize] == 0 {
|
||||
table[hi as usize] = case_id as u8;
|
||||
}
|
||||
},
|
||||
&syn::Pat::Wild(_) => {
|
||||
for byte in table.iter_mut() {
|
||||
if *byte == 0 {
|
||||
*byte = case_id as u8;
|
||||
}
|
||||
}
|
||||
},
|
||||
&syn::Pat::Ident(syn::PatIdent { ident, .. }) => {
|
||||
assert_eq!(wildcard, None);
|
||||
wildcard = Some(ident);
|
||||
for byte in table.iter_mut() {
|
||||
if *byte == 0 {
|
||||
*byte = case_id as u8;
|
||||
}
|
||||
}
|
||||
},
|
||||
_ => {
|
||||
panic!("Unexpected pattern: {:?}. Buggy code ?", pat);
|
||||
}
|
||||
*binding = Some(ident)
|
||||
}
|
||||
Some(syn::TokenTree::Token(syn::Token::Underscore)) => {
|
||||
assert_eq!(last_byte, None);
|
||||
for byte in table.iter_mut() {
|
||||
if *byte == 0 {
|
||||
*byte = case_id;
|
||||
}
|
||||
}
|
||||
},
|
||||
other => panic!("Expected literal byte, got: {:?}", other),
|
||||
}
|
||||
cases.push(quote!(#name = #index));
|
||||
let body = &arm.body;
|
||||
match_body.push(quote!(Case::#name => { #body }))
|
||||
}
|
||||
let en = quote!(enum Case {
|
||||
#(#cases),*
|
||||
});
|
||||
|
||||
match tts.next() {
|
||||
Some(syn::TokenTree::Delimited(syn::Delimited { delim: syn::DelimToken::Brace, tts })) => {
|
||||
Case(tts)
|
||||
}
|
||||
other => panic!("Expected case with braces after fat arrow, got: {:?}", other),
|
||||
let mut table_content = Vec::new();
|
||||
for entry in table.iter() {
|
||||
let name: syn::Path = syn::parse_str(&format!("Case::Case{}", entry)).unwrap();
|
||||
table_content.push(name);
|
||||
}
|
||||
}
|
||||
let table = quote!(static __CASES: [Case; 256] = [#(#table_content),*];);
|
||||
|
||||
fn expand_match_bytes_macro(to_be_matched: Vec<syn::TokenTree>,
|
||||
table: &[u8; 256],
|
||||
cases: Vec<Case>,
|
||||
binding: Option<syn::Ident>)
|
||||
-> String {
|
||||
use std::fmt::Write;
|
||||
|
||||
assert!(!to_be_matched.is_empty());
|
||||
assert!(table.iter().all(|b| *b != 0), "Incomplete pattern? Bogus code!");
|
||||
|
||||
// We build the expression with text since it's easier.
|
||||
let mut expr = "{\n".to_owned();
|
||||
expr.push_str("enum Case {\n");
|
||||
for (i, _) in cases.iter().enumerate() {
|
||||
write!(&mut expr, "Case{} = {},", i + 1, i + 1).unwrap();
|
||||
}
|
||||
expr.push_str("}\n"); // enum Case
|
||||
|
||||
expr.push_str("static __CASES: [Case; 256] = [");
|
||||
for byte in table.iter() {
|
||||
write!(&mut expr, "Case::Case{}, ", *byte).unwrap();
|
||||
}
|
||||
expr.push_str("];\n");
|
||||
|
||||
let mut tokens = Tokens::new();
|
||||
let to_be_matched = syn::Delimited {
|
||||
delim: if binding.is_some() { syn::DelimToken::Brace } else { syn::DelimToken::Paren },
|
||||
tts: to_be_matched
|
||||
let expr = if let Some(binding) = wildcard {
|
||||
quote!({ #en #table let #binding = #expr; match __CASES[#binding as usize] { #(#match_body),* }})
|
||||
} else {
|
||||
quote!({ #en #table match __CASES[#expr as usize] { #(#match_body),* }})
|
||||
};
|
||||
to_be_matched.to_tokens(&mut tokens);
|
||||
|
||||
if let Some(ref binding) = binding {
|
||||
write!(&mut expr, "let {} = {};\n", binding.to_string(), tokens.as_str()).unwrap();
|
||||
}
|
||||
|
||||
write!(&mut expr, "match __CASES[{} as usize] {{", match binding {
|
||||
Some(binding) => binding.to_string(),
|
||||
None => tokens.to_string(),
|
||||
}).unwrap();
|
||||
|
||||
for (i, case) in cases.into_iter().enumerate() {
|
||||
let mut case_tokens = Tokens::new();
|
||||
let case = syn::Delimited {
|
||||
delim: syn::DelimToken::Brace,
|
||||
tts: case.0
|
||||
};
|
||||
case.to_tokens(&mut case_tokens);
|
||||
write!(&mut expr, "Case::Case{} => {},\n", i + 1, case_tokens.as_str()).unwrap();
|
||||
}
|
||||
expr.push_str("}\n"); // match
|
||||
|
||||
expr.push_str("}\n"); // top
|
||||
|
||||
expr
|
||||
syn::parse2(expr.into()).unwrap()
|
||||
}
|
||||
|
||||
impl Fold for MatchByteParser {
|
||||
fn fold_stmt(&mut self, stmt: syn::Stmt) -> syn::Stmt {
|
||||
match stmt {
|
||||
syn::Stmt::Item(syn::Item::Macro(syn::ItemMacro{ ref mac, .. })) => {
|
||||
if mac.path == parse_quote!(match_byte) {
|
||||
return syn::fold::fold_stmt(self, syn::Stmt::Expr(expand_match_byte(&mac.tts)))
|
||||
}
|
||||
},
|
||||
_ => {}
|
||||
}
|
||||
|
||||
syn::fold::fold_stmt(self, stmt)
|
||||
}
|
||||
|
||||
fn fold_expr(&mut self, expr: syn::Expr) -> syn::Expr {
|
||||
match expr {
|
||||
syn::Expr::Macro(syn::ExprMacro{ ref mac, .. }) => {
|
||||
if mac.path == parse_quote!(match_byte) {
|
||||
return syn::fold::fold_expr(self, expand_match_byte(&mac.tts))
|
||||
}
|
||||
},
|
||||
_ => {}
|
||||
}
|
||||
|
||||
syn::fold::fold_expr(self, expr)
|
||||
}
|
||||
}
|
||||
|
30
third_party/rust/cssparser/src/unicode_range.rs
vendored
30
third_party/rust/cssparser/src/unicode_range.rs
vendored
@ -6,7 +6,6 @@
|
||||
|
||||
use {Parser, ToCss, BasicParseError};
|
||||
use std::char;
|
||||
use std::cmp;
|
||||
use std::fmt;
|
||||
use tokenizer::Token;
|
||||
|
||||
@ -166,32 +165,9 @@ impl fmt::Debug for UnicodeRange {
|
||||
|
||||
impl ToCss for UnicodeRange {
|
||||
fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
|
||||
dest.write_str("U+")?;
|
||||
|
||||
// How many bits are 0 at the end of start and also 1 at the end of end.
|
||||
let bits = cmp::min(self.start.trailing_zeros(), (!self.end).trailing_zeros());
|
||||
|
||||
let question_marks = bits / 4;
|
||||
|
||||
// How many lower bits can be represented as question marks
|
||||
let bits = question_marks * 4;
|
||||
|
||||
let truncated_start = self.start >> bits;
|
||||
let truncated_end = self.end >> bits;
|
||||
if truncated_start == truncated_end {
|
||||
// Bits not covered by question marks are the same in start and end,
|
||||
// we can use the question mark syntax.
|
||||
if truncated_start != 0 {
|
||||
write!(dest, "{:X}", truncated_start)?;
|
||||
}
|
||||
for _ in 0..question_marks {
|
||||
dest.write_str("?")?;
|
||||
}
|
||||
} else {
|
||||
write!(dest, "{:X}", self.start)?;
|
||||
if self.end != self.start {
|
||||
write!(dest, "-{:X}", self.end)?;
|
||||
}
|
||||
write!(dest, "U+{:X}", self.start)?;
|
||||
if self.end != self.start {
|
||||
write!(dest, "-{:X}", self.end)?;
|
||||
}
|
||||
Ok(())
|
||||
}
|
||||
|
1
third_party/rust/itoa-0.3.1/.cargo-checksum.json
vendored
Normal file
1
third_party/rust/itoa-0.3.1/.cargo-checksum.json
vendored
Normal file
@ -0,0 +1 @@
|
||||
{"files":{".travis.yml":"a2b867b2e28af9bde20a669a6ff0f366ecc5150b89314cd7ec97ed95bb427547","Cargo.toml":"82b9e862ca8c12656987883e7339d992b770b2a8b23a9cd9ceb5ae0083252687","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"e18259ab3aa7f39a194795bdad8039b3c5fd544f6dd922526c9326c44842b76d","README.md":"f2b713cdc7ade373c4a733c09693cecd288201ec76bde725de65b4ff74530284","benches/bench.rs":"3e7075b70a899ab1e926403856afeb04b34a254b234bbca834f6136a703008a3","performance.png":"a6e70647a44084e65cedaaff3633b0624b37e0f0a84457362c1e078fb56c877d","src/lib.rs":"16169ef9fc6c6a6521daff8fefdfc1b54f4ce145763b9733308d6631dad4d14e","tests/test.rs":"9c7629f758e2833757c15617cd8c1ec2a2fb8437865d05b5d20abb07279d35ea"},"package":"eb2f404fbc66fd9aac13e998248505e7ecb2ad8e44ab6388684c5fb11c6c251c"}
|
6
third_party/rust/itoa-0.3.1/.travis.yml
vendored
Normal file
6
third_party/rust/itoa-0.3.1/.travis.yml
vendored
Normal file
@ -0,0 +1,6 @@
|
||||
sudo: false
|
||||
|
||||
language: rust
|
||||
|
||||
rust:
|
||||
- nightly
|
9
third_party/rust/itoa-0.3.1/Cargo.toml
vendored
Normal file
9
third_party/rust/itoa-0.3.1/Cargo.toml
vendored
Normal file
@ -0,0 +1,9 @@
|
||||
[package]
|
||||
name = "itoa"
|
||||
version = "0.3.1"
|
||||
authors = ["David Tolnay <dtolnay@gmail.com>"]
|
||||
license = "MIT/Apache-2.0"
|
||||
description = "Fast functions for printing integer primitives to an io::Write"
|
||||
repository = "https://github.com/dtolnay/itoa"
|
||||
documentation = "https://github.com/dtolnay/itoa"
|
||||
categories = ["value-formatting"]
|
201
third_party/rust/itoa-0.3.1/LICENSE-APACHE
vendored
Normal file
201
third_party/rust/itoa-0.3.1/LICENSE-APACHE
vendored
Normal file
@ -0,0 +1,201 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
25
third_party/rust/itoa-0.3.1/LICENSE-MIT
vendored
Normal file
25
third_party/rust/itoa-0.3.1/LICENSE-MIT
vendored
Normal file
@ -0,0 +1,25 @@
|
||||
Copyright (c) 2016 Itoa Developers
|
||||
|
||||
Permission is hereby granted, free of charge, to any
|
||||
person obtaining a copy of this software and associated
|
||||
documentation files (the "Software"), to deal in the
|
||||
Software without restriction, including without
|
||||
limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software
|
||||
is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice
|
||||
shall be included in all copies or substantial portions
|
||||
of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
|
||||
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
||||
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
|
||||
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
70
third_party/rust/itoa-0.3.1/README.md
vendored
Normal file
70
third_party/rust/itoa-0.3.1/README.md
vendored
Normal file
@ -0,0 +1,70 @@
|
||||
itoa
|
||||
====
|
||||
|
||||
[![Build Status](https://api.travis-ci.org/dtolnay/itoa.svg?branch=master)](https://travis-ci.org/dtolnay/itoa)
|
||||
[![Latest Version](https://img.shields.io/crates/v/itoa.svg)](https://crates.io/crates/itoa)
|
||||
|
||||
This crate provides fast functions for printing integer primitives to an
|
||||
[`io::Write`](https://doc.rust-lang.org/std/io/trait.Write.html). The
|
||||
implementation comes straight from
|
||||
[libcore](https://github.com/rust-lang/rust/blob/b8214dc6c6fc20d0a660fb5700dca9ebf51ebe89/src/libcore/fmt/num.rs#L201-L254)
|
||||
but avoids the performance penalty of going through
|
||||
[`fmt::Formatter`](https://doc.rust-lang.org/std/fmt/struct.Formatter.html).
|
||||
|
||||
See also [`dtoa`](https://github.com/dtolnay/dtoa) for printing floating point
|
||||
primitives.
|
||||
|
||||
## Performance
|
||||
|
||||
![performance](https://raw.githubusercontent.com/dtolnay/itoa/master/performance.png)
|
||||
|
||||
## Functions
|
||||
|
||||
```rust
|
||||
extern crate itoa;
|
||||
|
||||
// write to a vector or other io::Write
|
||||
let mut buf = Vec::new();
|
||||
itoa::write(&mut buf, 128u64)?;
|
||||
println!("{:?}", buf);
|
||||
|
||||
// write to a stack buffer
|
||||
let mut bytes = [b'\0'; 20];
|
||||
let n = itoa::write(&mut bytes[..], 128u64)?;
|
||||
println!("{:?}", &bytes[..n]);
|
||||
```
|
||||
|
||||
The function signature is:
|
||||
|
||||
```rust
|
||||
fn write<W: io::Write, V: itoa::Integer>(writer: W, value: V) -> io::Result<usize>
|
||||
```
|
||||
|
||||
where `itoa::Integer` is implemented for `i8`, `u8`, `i16`, `u16`, `i32`, `u32`,
|
||||
`i64`, `u64`, `isize` and `usize`. The return value gives the number of bytes
|
||||
written.
|
||||
|
||||
## Dependency
|
||||
|
||||
Itoa is available on [crates.io](https://crates.io/crates/itoa). Use the
|
||||
following in `Cargo.toml`:
|
||||
|
||||
```toml
|
||||
[dependencies]
|
||||
itoa = "0.3"
|
||||
```
|
||||
|
||||
## License
|
||||
|
||||
Licensed under either of
|
||||
|
||||
* Apache License, Version 2.0 ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0)
|
||||
* MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT)
|
||||
|
||||
at your option.
|
||||
|
||||
### Contribution
|
||||
|
||||
Unless you explicitly state otherwise, any contribution intentionally submitted
|
||||
for inclusion in itoa by you, as defined in the Apache-2.0 license, shall be
|
||||
dual licensed as above, without any additional terms or conditions.
|
52
third_party/rust/itoa-0.3.1/benches/bench.rs
vendored
Normal file
52
third_party/rust/itoa-0.3.1/benches/bench.rs
vendored
Normal file
@ -0,0 +1,52 @@
|
||||
#![feature(test)]
|
||||
#![allow(non_snake_case)]
|
||||
|
||||
extern crate itoa;
|
||||
extern crate test;
|
||||
|
||||
macro_rules! benches {
|
||||
($($name:ident($value:expr),)*) => {
|
||||
mod bench_itoa {
|
||||
use test::{Bencher, black_box};
|
||||
$(
|
||||
#[bench]
|
||||
fn $name(b: &mut Bencher) {
|
||||
use itoa;
|
||||
|
||||
let mut buf = Vec::with_capacity(20);
|
||||
|
||||
b.iter(|| {
|
||||
buf.clear();
|
||||
itoa::write(&mut buf, black_box($value)).unwrap()
|
||||
});
|
||||
}
|
||||
)*
|
||||
}
|
||||
|
||||
mod bench_fmt {
|
||||
use test::{Bencher, black_box};
|
||||
$(
|
||||
#[bench]
|
||||
fn $name(b: &mut Bencher) {
|
||||
use std::io::Write;
|
||||
|
||||
let mut buf = Vec::with_capacity(20);
|
||||
|
||||
b.iter(|| {
|
||||
buf.clear();
|
||||
write!(&mut buf, "{}", black_box($value)).unwrap()
|
||||
});
|
||||
}
|
||||
)*
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
benches!(
|
||||
bench_0u64(0u64),
|
||||
bench_HALFu64(<u32>::max_value() as u64),
|
||||
bench_MAXu64(<u64>::max_value()),
|
||||
|
||||
bench_0i16(0i16),
|
||||
bench_MINi16(<i16>::min_value()),
|
||||
);
|
Before Width: | Height: | Size: 73 KiB After Width: | Height: | Size: 73 KiB |
101
third_party/rust/itoa-0.3.1/src/lib.rs
vendored
Normal file
101
third_party/rust/itoa-0.3.1/src/lib.rs
vendored
Normal file
@ -0,0 +1,101 @@
|
||||
// Copyright 2016 Itoa Developers
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
||||
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
||||
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use std::{io, mem, ptr, slice};
|
||||
|
||||
#[inline]
|
||||
pub fn write<W: io::Write, V: Integer>(wr: W, value: V) -> io::Result<usize> {
|
||||
value.write(wr)
|
||||
}
|
||||
|
||||
pub trait Integer {
|
||||
fn write<W: io::Write>(self, W) -> io::Result<usize>;
|
||||
}
|
||||
|
||||
const DEC_DIGITS_LUT: &'static[u8] =
|
||||
b"0001020304050607080910111213141516171819\
|
||||
2021222324252627282930313233343536373839\
|
||||
4041424344454647484950515253545556575859\
|
||||
6061626364656667686970717273747576777879\
|
||||
8081828384858687888990919293949596979899";
|
||||
|
||||
// Adaptation of the original implementation at
|
||||
// https://github.com/rust-lang/rust/blob/b8214dc6c6fc20d0a660fb5700dca9ebf51ebe89/src/libcore/fmt/num.rs#L188-L266
|
||||
macro_rules! impl_Integer {
|
||||
($($t:ident),* as $conv_fn:ident) => ($(
|
||||
impl Integer for $t {
|
||||
#[allow(unused_comparisons)]
|
||||
fn write<W: io::Write>(self, mut wr: W) -> io::Result<usize> {
|
||||
let is_nonnegative = self >= 0;
|
||||
let mut n = if is_nonnegative {
|
||||
self as $conv_fn
|
||||
} else {
|
||||
try!(wr.write_all(b"-"));
|
||||
// convert the negative num to positive by summing 1 to it's 2 complement
|
||||
(!(self as $conv_fn)).wrapping_add(1)
|
||||
};
|
||||
let mut buf: [u8; 20] = unsafe { mem::uninitialized() };
|
||||
let mut curr = buf.len() as isize;
|
||||
let buf_ptr = buf.as_mut_ptr();
|
||||
let lut_ptr = DEC_DIGITS_LUT.as_ptr();
|
||||
|
||||
unsafe {
|
||||
// eagerly decode 4 characters at a time
|
||||
if <$t>::max_value() as u64 >= 10000 {
|
||||
while n >= 10000 {
|
||||
let rem = (n % 10000) as isize;
|
||||
n /= 10000;
|
||||
|
||||
let d1 = (rem / 100) << 1;
|
||||
let d2 = (rem % 100) << 1;
|
||||
curr -= 4;
|
||||
ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2);
|
||||
ptr::copy_nonoverlapping(lut_ptr.offset(d2), buf_ptr.offset(curr + 2), 2);
|
||||
}
|
||||
}
|
||||
|
||||
// if we reach here numbers are <= 9999, so at most 4 chars long
|
||||
let mut n = n as isize; // possibly reduce 64bit math
|
||||
|
||||
// decode 2 more chars, if > 2 chars
|
||||
if n >= 100 {
|
||||
let d1 = (n % 100) << 1;
|
||||
n /= 100;
|
||||
curr -= 2;
|
||||
ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2);
|
||||
}
|
||||
|
||||
// decode last 1 or 2 chars
|
||||
if n < 10 {
|
||||
curr -= 1;
|
||||
*buf_ptr.offset(curr) = (n as u8) + 48;
|
||||
} else {
|
||||
let d1 = n << 1;
|
||||
curr -= 2;
|
||||
ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2);
|
||||
}
|
||||
}
|
||||
|
||||
let mut len = buf.len() - curr as usize;
|
||||
try!(wr.write_all(unsafe { slice::from_raw_parts(buf_ptr.offset(curr), len) }));
|
||||
if !is_nonnegative {
|
||||
len += 1;
|
||||
}
|
||||
Ok(len)
|
||||
}
|
||||
})*);
|
||||
}
|
||||
|
||||
impl_Integer!(i8, u8, i16, u16, i32, u32 as u32);
|
||||
impl_Integer!(i64, u64 as u64);
|
||||
#[cfg(target_pointer_width = "16")]
|
||||
impl_Integer!(isize, usize as u16);
|
||||
#[cfg(target_pointer_width = "32")]
|
||||
impl_Integer!(isize, usize as u32);
|
||||
#[cfg(target_pointer_width = "64")]
|
||||
impl_Integer!(isize, usize as u64);
|
25
third_party/rust/itoa-0.3.1/tests/test.rs
vendored
Normal file
25
third_party/rust/itoa-0.3.1/tests/test.rs
vendored
Normal file
@ -0,0 +1,25 @@
|
||||
#![allow(non_snake_case)]
|
||||
|
||||
extern crate itoa;
|
||||
|
||||
macro_rules! test {
|
||||
($($name:ident($value:expr, $expected:expr),)*) => {
|
||||
$(
|
||||
#[test]
|
||||
fn $name() {
|
||||
let mut buf = [b'\0'; 20];
|
||||
let len = itoa::write(&mut buf[..], $value).unwrap();
|
||||
assert_eq!(&buf[0..len], $expected.as_bytes());
|
||||
}
|
||||
)*
|
||||
}
|
||||
}
|
||||
|
||||
test!(
|
||||
test_0u64(0u64, "0"),
|
||||
test_HALFu64(<u32>::max_value() as u64, "4294967295"),
|
||||
test_MAXu64(<u64>::max_value(), "18446744073709551615"),
|
||||
|
||||
test_0i16(0i16, "0"),
|
||||
test_MINi16(<i16>::min_value(), "-32768"),
|
||||
);
|
2
third_party/rust/itoa/.cargo-checksum.json
vendored
2
third_party/rust/itoa/.cargo-checksum.json
vendored
@ -1 +1 @@
|
||||
{"files":{".travis.yml":"a2b867b2e28af9bde20a669a6ff0f366ecc5150b89314cd7ec97ed95bb427547","Cargo.toml":"82b9e862ca8c12656987883e7339d992b770b2a8b23a9cd9ceb5ae0083252687","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"e18259ab3aa7f39a194795bdad8039b3c5fd544f6dd922526c9326c44842b76d","README.md":"f2b713cdc7ade373c4a733c09693cecd288201ec76bde725de65b4ff74530284","benches/bench.rs":"3e7075b70a899ab1e926403856afeb04b34a254b234bbca834f6136a703008a3","performance.png":"a6e70647a44084e65cedaaff3633b0624b37e0f0a84457362c1e078fb56c877d","src/lib.rs":"16169ef9fc6c6a6521daff8fefdfc1b54f4ce145763b9733308d6631dad4d14e","tests/test.rs":"9c7629f758e2833757c15617cd8c1ec2a2fb8437865d05b5d20abb07279d35ea"},"package":"eb2f404fbc66fd9aac13e998248505e7ecb2ad8e44ab6388684c5fb11c6c251c"}
|
||||
{"files":{".travis.yml":"9d502b83053fa50b10c712dbb1c7356accf1cc2734f50ae5d75f7c8fdd7a6da5","Cargo.toml":"7a7c831ec60febe8ffdf8d56c436a2dfeb486c870d2f148a8849a2d06122b635","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"e18259ab3aa7f39a194795bdad8039b3c5fd544f6dd922526c9326c44842b76d","README.md":"57b4b49c5ceea9cf94e3856537c01cc1a7e3d071b04d5f5d45155259bfcb83b3","benches/bench.rs":"4cce63083f2e362db65dfad767b777cc39e6555fe635b8551aa485c63080773e","src/lib.rs":"503dc2b0c33f1477f1b6744d103ead1456e91cd1147689a0d0c9e6569225feb4","src/udiv128.rs":"efafb66d62b8229478a448ffb3e11a8ad57f5b336aadd59d5b3bf945cfffba96","tests/test.rs":"55a4b5f21b0f1322d7a42d837ca9f2766eb25416cfcdd9514220fb3bebc0f586"},"package":"c069bbec61e1ca5a596166e55dfe4773ff745c3d16b700013bcaff9a6df2c682"}
|
19
third_party/rust/itoa/.travis.yml
vendored
19
third_party/rust/itoa/.travis.yml
vendored
@ -1,6 +1,19 @@
|
||||
sudo: false
|
||||
|
||||
language: rust
|
||||
|
||||
rust:
|
||||
- nightly
|
||||
matrix:
|
||||
include:
|
||||
- rust: stable
|
||||
- rust: beta
|
||||
- rust: nightly
|
||||
env:
|
||||
- FEATURES="i128"
|
||||
- BUILD_BENCH="true"
|
||||
|
||||
script:
|
||||
- cargo build --verbose --features "$FEATURES"
|
||||
- cargo test --verbose --features "$FEATURES"
|
||||
- cargo build --verbose --no-default-features --features "$FEATURES"
|
||||
- cargo test --verbose --no-default-features --features "$FEATURES"
|
||||
- if [ "$BUILD_BENCH" == "true" ]; then cargo bench --verbose --no-run --features "$FEATURES"; fi
|
||||
|
||||
|
25
third_party/rust/itoa/Cargo.toml
vendored
25
third_party/rust/itoa/Cargo.toml
vendored
@ -1,9 +1,28 @@
|
||||
# THIS FILE IS AUTOMATICALLY GENERATED BY CARGO
|
||||
#
|
||||
# When uploading crates to the registry Cargo will automatically
|
||||
# "normalize" Cargo.toml files for maximal compatibility
|
||||
# with all versions of Cargo and also rewrite `path` dependencies
|
||||
# to registry (e.g. crates.io) dependencies
|
||||
#
|
||||
# If you believe there's an error in this file please file an
|
||||
# issue against the rust-lang/cargo repository. If you're
|
||||
# editing this file be aware that the upstream Cargo.toml
|
||||
# will likely look very different (and much more reasonable)
|
||||
|
||||
[package]
|
||||
name = "itoa"
|
||||
version = "0.3.1"
|
||||
version = "0.4.1"
|
||||
authors = ["David Tolnay <dtolnay@gmail.com>"]
|
||||
license = "MIT/Apache-2.0"
|
||||
exclude = ["performance.png"]
|
||||
description = "Fast functions for printing integer primitives to an io::Write"
|
||||
repository = "https://github.com/dtolnay/itoa"
|
||||
documentation = "https://github.com/dtolnay/itoa"
|
||||
readme = "README.md"
|
||||
categories = ["value-formatting"]
|
||||
license = "MIT/Apache-2.0"
|
||||
repository = "https://github.com/dtolnay/itoa"
|
||||
|
||||
[features]
|
||||
default = ["std"]
|
||||
i128 = []
|
||||
std = []
|
||||
|
26
third_party/rust/itoa/README.md
vendored
26
third_party/rust/itoa/README.md
vendored
@ -5,7 +5,8 @@ itoa
|
||||
[![Latest Version](https://img.shields.io/crates/v/itoa.svg)](https://crates.io/crates/itoa)
|
||||
|
||||
This crate provides fast functions for printing integer primitives to an
|
||||
[`io::Write`](https://doc.rust-lang.org/std/io/trait.Write.html). The
|
||||
[`io::Write`](https://doc.rust-lang.org/std/io/trait.Write.html) or a
|
||||
[`fmt::Write`](https://doc.rust-lang.org/core/fmt/trait.Write.html). The
|
||||
implementation comes straight from
|
||||
[libcore](https://github.com/rust-lang/rust/blob/b8214dc6c6fc20d0a660fb5700dca9ebf51ebe89/src/libcore/fmt/num.rs#L201-L254)
|
||||
but avoids the performance penalty of going through
|
||||
@ -14,7 +15,7 @@ but avoids the performance penalty of going through
|
||||
See also [`dtoa`](https://github.com/dtolnay/dtoa) for printing floating point
|
||||
primitives.
|
||||
|
||||
## Performance
|
||||
## Performance (lower is better)
|
||||
|
||||
![performance](https://raw.githubusercontent.com/dtolnay/itoa/master/performance.png)
|
||||
|
||||
@ -32,17 +33,28 @@ println!("{:?}", buf);
|
||||
let mut bytes = [b'\0'; 20];
|
||||
let n = itoa::write(&mut bytes[..], 128u64)?;
|
||||
println!("{:?}", &bytes[..n]);
|
||||
|
||||
// write to a String
|
||||
let mut s = String::new();
|
||||
itoa::fmt(&mut s, 128u64)?;
|
||||
println!("{}", s);
|
||||
```
|
||||
|
||||
The function signature is:
|
||||
The function signatures are:
|
||||
|
||||
```rust
|
||||
fn write<W: io::Write, V: itoa::Integer>(writer: W, value: V) -> io::Result<usize>
|
||||
fn write<W: io::Write, V: itoa::Integer>(writer: W, value: V) -> io::Result<usize>;
|
||||
|
||||
fn fmt<W: fmt::Write, V: itoa::Integer>(writer: W, value: V) -> fmt::Result;
|
||||
```
|
||||
|
||||
where `itoa::Integer` is implemented for `i8`, `u8`, `i16`, `u16`, `i32`, `u32`,
|
||||
`i64`, `u64`, `isize` and `usize`. The return value gives the number of bytes
|
||||
written.
|
||||
`i64`, `u64`, `i128`, `u128`, `isize` and `usize`. 128-bit integer support is
|
||||
only available with the nightly compiler when the `i128` feature is enabled for
|
||||
this crate. The return value gives the number of bytes written.
|
||||
|
||||
The `write` function is only available when the `std` feature is enabled
|
||||
(default is enabled).
|
||||
|
||||
## Dependency
|
||||
|
||||
@ -51,7 +63,7 @@ following in `Cargo.toml`:
|
||||
|
||||
```toml
|
||||
[dependencies]
|
||||
itoa = "0.3"
|
||||
itoa = "0.4"
|
||||
```
|
||||
|
||||
## License
|
||||
|
58
third_party/rust/itoa/benches/bench.rs
vendored
58
third_party/rust/itoa/benches/bench.rs
vendored
@ -1,3 +1,7 @@
|
||||
#![cfg_attr(feature = "i128", feature(i128_type, i128))]
|
||||
|
||||
#![cfg_attr(feature = "cargo-clippy", allow(cast_lossless))]
|
||||
|
||||
#![feature(test)]
|
||||
#![allow(non_snake_case)]
|
||||
|
||||
@ -5,15 +9,21 @@ extern crate itoa;
|
||||
extern crate test;
|
||||
|
||||
macro_rules! benches {
|
||||
($($name:ident($value:expr),)*) => {
|
||||
mod bench_itoa {
|
||||
(
|
||||
$(
|
||||
$(#[$attr:meta])*
|
||||
$name:ident($value:expr)
|
||||
),*
|
||||
) => {
|
||||
mod bench_itoa_write {
|
||||
use test::{Bencher, black_box};
|
||||
$(
|
||||
$(#[$attr])*
|
||||
#[bench]
|
||||
fn $name(b: &mut Bencher) {
|
||||
use itoa;
|
||||
|
||||
let mut buf = Vec::with_capacity(20);
|
||||
let mut buf = Vec::with_capacity(40);
|
||||
|
||||
b.iter(|| {
|
||||
buf.clear();
|
||||
@ -23,14 +33,33 @@ macro_rules! benches {
|
||||
)*
|
||||
}
|
||||
|
||||
mod bench_fmt {
|
||||
mod bench_itoa_fmt {
|
||||
use test::{Bencher, black_box};
|
||||
$(
|
||||
$(#[$attr])*
|
||||
#[bench]
|
||||
fn $name(b: &mut Bencher) {
|
||||
use itoa;
|
||||
|
||||
let mut buf = String::with_capacity(40);
|
||||
|
||||
b.iter(|| {
|
||||
buf.clear();
|
||||
itoa::fmt(&mut buf, black_box($value)).unwrap()
|
||||
});
|
||||
}
|
||||
)*
|
||||
}
|
||||
|
||||
mod bench_std_fmt {
|
||||
use test::{Bencher, black_box};
|
||||
$(
|
||||
$(#[$attr])*
|
||||
#[bench]
|
||||
fn $name(b: &mut Bencher) {
|
||||
use std::io::Write;
|
||||
|
||||
let mut buf = Vec::with_capacity(20);
|
||||
let mut buf = Vec::with_capacity(40);
|
||||
|
||||
b.iter(|| {
|
||||
buf.clear();
|
||||
@ -42,11 +71,16 @@ macro_rules! benches {
|
||||
}
|
||||
}
|
||||
|
||||
benches!(
|
||||
bench_0u64(0u64),
|
||||
bench_HALFu64(<u32>::max_value() as u64),
|
||||
bench_MAXu64(<u64>::max_value()),
|
||||
benches!{
|
||||
bench_u64_0(0u64),
|
||||
bench_u64_half(<u32>::max_value() as u64),
|
||||
bench_u64_max(<u64>::max_value()),
|
||||
|
||||
bench_0i16(0i16),
|
||||
bench_MINi16(<i16>::min_value()),
|
||||
);
|
||||
bench_i16_0(0i16),
|
||||
bench_i16_min(<i16>::min_value()),
|
||||
|
||||
#[cfg(feature = "i128")]
|
||||
bench_u128_0(0u128),
|
||||
#[cfg(feature = "i128")]
|
||||
bench_u128_max(<u128>::max_value())
|
||||
}
|
||||
|
282
third_party/rust/itoa/src/lib.rs
vendored
282
third_party/rust/itoa/src/lib.rs
vendored
@ -6,15 +6,57 @@
|
||||
// option. This file may not be copied, modified, or distributed
|
||||
// except according to those terms.
|
||||
|
||||
use std::{io, mem, ptr, slice};
|
||||
#![doc(html_root_url = "https://docs.rs/itoa/0.4.1")]
|
||||
|
||||
#![cfg_attr(not(feature = "std"), no_std)]
|
||||
|
||||
#![cfg_attr(feature = "i128", feature(i128_type, i128))]
|
||||
|
||||
#![cfg_attr(feature = "cargo-clippy", allow(cast_lossless, unreadable_literal))]
|
||||
|
||||
#[cfg(feature = "i128")]
|
||||
mod udiv128;
|
||||
|
||||
#[cfg(feature = "std")]
|
||||
use std::{fmt, io, mem, ptr, slice, str};
|
||||
|
||||
#[cfg(not(feature = "std"))]
|
||||
use core::{fmt, mem, ptr, slice, str};
|
||||
|
||||
/// Write integer to an `io::Write`.
|
||||
#[cfg(feature = "std")]
|
||||
#[inline]
|
||||
pub fn write<W: io::Write, V: Integer>(wr: W, value: V) -> io::Result<usize> {
|
||||
value.write(wr)
|
||||
}
|
||||
|
||||
pub trait Integer {
|
||||
/// Write integer to an `fmt::Write`.
|
||||
#[inline]
|
||||
pub fn fmt<W: fmt::Write, V: Integer>(wr: W, value: V) -> fmt::Result {
|
||||
value.fmt(wr)
|
||||
}
|
||||
|
||||
// Seal to prevent downstream implementations of the Integer trait.
|
||||
mod private {
|
||||
pub trait Sealed {}
|
||||
}
|
||||
|
||||
/// An integer that can be formatted by `itoa::write` and `itoa::fmt`.
|
||||
///
|
||||
/// This trait is sealed and cannot be implemented for types outside of itoa.
|
||||
pub trait Integer: private::Sealed {
|
||||
// Not public API.
|
||||
#[doc(hidden)]
|
||||
#[cfg(feature = "std")]
|
||||
fn write<W: io::Write>(self, W) -> io::Result<usize>;
|
||||
|
||||
// Not public API.
|
||||
#[doc(hidden)]
|
||||
fn fmt<W: fmt::Write>(self, W) -> fmt::Result;
|
||||
}
|
||||
|
||||
trait IntegerPrivate<B> {
|
||||
fn write_to(self, buf: &mut B) -> &[u8];
|
||||
}
|
||||
|
||||
const DEC_DIGITS_LUT: &'static[u8] =
|
||||
@ -26,76 +68,194 @@ const DEC_DIGITS_LUT: &'static[u8] =
|
||||
|
||||
// Adaptation of the original implementation at
|
||||
// https://github.com/rust-lang/rust/blob/b8214dc6c6fc20d0a660fb5700dca9ebf51ebe89/src/libcore/fmt/num.rs#L188-L266
|
||||
macro_rules! impl_IntegerCommon {
|
||||
($max_len:expr, $t:ident) => {
|
||||
impl Integer for $t {
|
||||
#[cfg(feature = "std")]
|
||||
#[inline]
|
||||
fn write<W: io::Write>(self, mut wr: W) -> io::Result<usize> {
|
||||
let mut buf: [u8; $max_len] = unsafe { mem::uninitialized() };
|
||||
let bytes = self.write_to(&mut buf);
|
||||
try!(wr.write_all(bytes));
|
||||
Ok(bytes.len())
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn fmt<W: fmt::Write>(self, mut wr: W) -> fmt::Result {
|
||||
let mut buf: [u8; $max_len] = unsafe { mem::uninitialized() };
|
||||
let bytes = self.write_to(&mut buf);
|
||||
wr.write_str(unsafe { str::from_utf8_unchecked(bytes) })
|
||||
}
|
||||
}
|
||||
|
||||
impl private::Sealed for $t {}
|
||||
};
|
||||
}
|
||||
|
||||
macro_rules! impl_Integer {
|
||||
($($t:ident),* as $conv_fn:ident) => ($(
|
||||
impl Integer for $t {
|
||||
#[allow(unused_comparisons)]
|
||||
fn write<W: io::Write>(self, mut wr: W) -> io::Result<usize> {
|
||||
let is_nonnegative = self >= 0;
|
||||
let mut n = if is_nonnegative {
|
||||
self as $conv_fn
|
||||
} else {
|
||||
try!(wr.write_all(b"-"));
|
||||
// convert the negative num to positive by summing 1 to it's 2 complement
|
||||
(!(self as $conv_fn)).wrapping_add(1)
|
||||
};
|
||||
let mut buf: [u8; 20] = unsafe { mem::uninitialized() };
|
||||
let mut curr = buf.len() as isize;
|
||||
let buf_ptr = buf.as_mut_ptr();
|
||||
let lut_ptr = DEC_DIGITS_LUT.as_ptr();
|
||||
($($max_len:expr => $t:ident),* as $conv_fn:ident) => {$(
|
||||
impl_IntegerCommon!($max_len, $t);
|
||||
|
||||
unsafe {
|
||||
// eagerly decode 4 characters at a time
|
||||
if <$t>::max_value() as u64 >= 10000 {
|
||||
while n >= 10000 {
|
||||
let rem = (n % 10000) as isize;
|
||||
n /= 10000;
|
||||
impl IntegerPrivate<[u8; $max_len]> for $t {
|
||||
#[allow(unused_comparisons)]
|
||||
#[inline]
|
||||
fn write_to(self, buf: &mut [u8; $max_len]) -> &[u8] {
|
||||
let is_nonnegative = self >= 0;
|
||||
let mut n = if is_nonnegative {
|
||||
self as $conv_fn
|
||||
} else {
|
||||
// convert the negative num to positive by summing 1 to it's 2 complement
|
||||
(!(self as $conv_fn)).wrapping_add(1)
|
||||
};
|
||||
let mut curr = buf.len() as isize;
|
||||
let buf_ptr = buf.as_mut_ptr();
|
||||
let lut_ptr = DEC_DIGITS_LUT.as_ptr();
|
||||
|
||||
let d1 = (rem / 100) << 1;
|
||||
let d2 = (rem % 100) << 1;
|
||||
curr -= 4;
|
||||
unsafe {
|
||||
// need at least 16 bits for the 4-characters-at-a-time to work.
|
||||
if mem::size_of::<$t>() >= 2 {
|
||||
// eagerly decode 4 characters at a time
|
||||
while n >= 10000 {
|
||||
let rem = (n % 10000) as isize;
|
||||
n /= 10000;
|
||||
|
||||
let d1 = (rem / 100) << 1;
|
||||
let d2 = (rem % 100) << 1;
|
||||
curr -= 4;
|
||||
ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2);
|
||||
ptr::copy_nonoverlapping(lut_ptr.offset(d2), buf_ptr.offset(curr + 2), 2);
|
||||
}
|
||||
}
|
||||
|
||||
// if we reach here numbers are <= 9999, so at most 4 chars long
|
||||
let mut n = n as isize; // possibly reduce 64bit math
|
||||
|
||||
// decode 2 more chars, if > 2 chars
|
||||
if n >= 100 {
|
||||
let d1 = (n % 100) << 1;
|
||||
n /= 100;
|
||||
curr -= 2;
|
||||
ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2);
|
||||
ptr::copy_nonoverlapping(lut_ptr.offset(d2), buf_ptr.offset(curr + 2), 2);
|
||||
}
|
||||
|
||||
// decode last 1 or 2 chars
|
||||
if n < 10 {
|
||||
curr -= 1;
|
||||
*buf_ptr.offset(curr) = (n as u8) + b'0';
|
||||
} else {
|
||||
let d1 = n << 1;
|
||||
curr -= 2;
|
||||
ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2);
|
||||
}
|
||||
|
||||
if !is_nonnegative {
|
||||
curr -= 1;
|
||||
*buf_ptr.offset(curr) = b'-';
|
||||
}
|
||||
}
|
||||
|
||||
// if we reach here numbers are <= 9999, so at most 4 chars long
|
||||
let mut n = n as isize; // possibly reduce 64bit math
|
||||
|
||||
// decode 2 more chars, if > 2 chars
|
||||
if n >= 100 {
|
||||
let d1 = (n % 100) << 1;
|
||||
n /= 100;
|
||||
curr -= 2;
|
||||
ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2);
|
||||
}
|
||||
|
||||
// decode last 1 or 2 chars
|
||||
if n < 10 {
|
||||
curr -= 1;
|
||||
*buf_ptr.offset(curr) = (n as u8) + 48;
|
||||
} else {
|
||||
let d1 = n << 1;
|
||||
curr -= 2;
|
||||
ptr::copy_nonoverlapping(lut_ptr.offset(d1), buf_ptr.offset(curr), 2);
|
||||
}
|
||||
let len = buf.len() - curr as usize;
|
||||
unsafe { slice::from_raw_parts(buf_ptr.offset(curr), len) }
|
||||
}
|
||||
|
||||
let mut len = buf.len() - curr as usize;
|
||||
try!(wr.write_all(unsafe { slice::from_raw_parts(buf_ptr.offset(curr), len) }));
|
||||
if !is_nonnegative {
|
||||
len += 1;
|
||||
}
|
||||
Ok(len)
|
||||
}
|
||||
})*);
|
||||
)*};
|
||||
}
|
||||
|
||||
impl_Integer!(i8, u8, i16, u16, i32, u32 as u32);
|
||||
impl_Integer!(i64, u64 as u64);
|
||||
const I8_MAX_LEN: usize = 4;
|
||||
const U8_MAX_LEN: usize = 3;
|
||||
const I16_MAX_LEN: usize = 6;
|
||||
const U16_MAX_LEN: usize = 5;
|
||||
const I32_MAX_LEN: usize = 11;
|
||||
const U32_MAX_LEN: usize = 10;
|
||||
const I64_MAX_LEN: usize = 20;
|
||||
const U64_MAX_LEN: usize = 20;
|
||||
|
||||
impl_Integer!(
|
||||
I8_MAX_LEN => i8,
|
||||
U8_MAX_LEN => u8,
|
||||
I16_MAX_LEN => i16,
|
||||
U16_MAX_LEN => u16,
|
||||
I32_MAX_LEN => i32,
|
||||
U32_MAX_LEN => u32
|
||||
as u32);
|
||||
|
||||
impl_Integer!(I64_MAX_LEN => i64, U64_MAX_LEN => u64 as u64);
|
||||
|
||||
#[cfg(target_pointer_width = "16")]
|
||||
impl_Integer!(isize, usize as u16);
|
||||
impl_Integer!(I16_MAX_LEN => isize, U16_MAX_LEN => usize as u16);
|
||||
|
||||
#[cfg(target_pointer_width = "32")]
|
||||
impl_Integer!(isize, usize as u32);
|
||||
impl_Integer!(I32_MAX_LEN => isize, U32_MAX_LEN => usize as u32);
|
||||
|
||||
#[cfg(target_pointer_width = "64")]
|
||||
impl_Integer!(isize, usize as u64);
|
||||
impl_Integer!(I64_MAX_LEN => isize, U64_MAX_LEN => usize as u64);
|
||||
|
||||
#[cfg(all(feature = "i128"))]
|
||||
macro_rules! impl_Integer128 {
|
||||
($($max_len:expr => $t:ident),*) => {$(
|
||||
impl_IntegerCommon!($max_len, $t);
|
||||
|
||||
impl IntegerPrivate<[u8; $max_len]> for $t {
|
||||
#[allow(unused_comparisons)]
|
||||
#[inline]
|
||||
fn write_to(self, buf: &mut [u8; $max_len]) -> &[u8] {
|
||||
let is_nonnegative = self >= 0;
|
||||
let n = if is_nonnegative {
|
||||
self as u128
|
||||
} else {
|
||||
// convert the negative num to positive by summing 1 to it's 2 complement
|
||||
(!(self as u128)).wrapping_add(1)
|
||||
};
|
||||
let mut curr = buf.len() as isize;
|
||||
let buf_ptr = buf.as_mut_ptr();
|
||||
|
||||
unsafe {
|
||||
// Divide by 10^19 which is the highest power less than 2^64.
|
||||
let (n, rem) = udiv128::udivmod_1e19(n);
|
||||
let buf1 = buf_ptr.offset(curr - U64_MAX_LEN as isize) as *mut [u8; U64_MAX_LEN];
|
||||
curr -= rem.write_to(&mut *buf1).len() as isize;
|
||||
|
||||
if n != 0 {
|
||||
// Memset the base10 leading zeros of rem.
|
||||
let target = buf.len() as isize - 19;
|
||||
ptr::write_bytes(buf_ptr.offset(target), b'0', (curr - target) as usize);
|
||||
curr = target;
|
||||
|
||||
// Divide by 10^19 again.
|
||||
let (n, rem) = udiv128::udivmod_1e19(n);
|
||||
let buf2 = buf_ptr.offset(curr - U64_MAX_LEN as isize) as *mut [u8; U64_MAX_LEN];
|
||||
curr -= rem.write_to(&mut *buf2).len() as isize;
|
||||
|
||||
if n != 0 {
|
||||
// Memset the leading zeros.
|
||||
let target = buf.len() as isize - 38;
|
||||
ptr::write_bytes(buf_ptr.offset(target), b'0', (curr - target) as usize);
|
||||
curr = target;
|
||||
|
||||
// There is at most one digit left
|
||||
// because u128::max / 10^19 / 10^19 is 3.
|
||||
curr -= 1;
|
||||
*buf_ptr.offset(curr) = (n as u8) + b'0';
|
||||
}
|
||||
}
|
||||
|
||||
if !is_nonnegative {
|
||||
curr -= 1;
|
||||
*buf_ptr.offset(curr) = b'-';
|
||||
}
|
||||
|
||||
let len = buf.len() - curr as usize;
|
||||
slice::from_raw_parts(buf_ptr.offset(curr), len)
|
||||
}
|
||||
}
|
||||
}
|
||||
)*};
|
||||
}
|
||||
|
||||
#[cfg(all(feature = "i128"))]
|
||||
const U128_MAX_LEN: usize = 39;
|
||||
#[cfg(all(feature = "i128"))]
|
||||
const I128_MAX_LEN: usize = 40;
|
||||
|
||||
#[cfg(all(feature = "i128"))]
|
||||
impl_Integer128!(I128_MAX_LEN => i128, U128_MAX_LEN => u128);
|
||||
|
63
third_party/rust/itoa/src/udiv128.rs
vendored
Normal file
63
third_party/rust/itoa/src/udiv128.rs
vendored
Normal file
@ -0,0 +1,63 @@
|
||||
// Copyright 2009-2016 compiler-builtins Developers
|
||||
//
|
||||
// The compiler-builtins crate is dual licensed under both the University of
|
||||
// Illinois "BSD-Like" license and the MIT license. As a user of this code you may
|
||||
// choose to use it under either license. As a contributor, you agree to allow
|
||||
// your code to be used under both.
|
||||
//
|
||||
// Full text of the relevant licenses is found here:
|
||||
// https://github.com/rust-lang-nursery/compiler-builtins/blob/master/LICENSE.TXT
|
||||
//
|
||||
//
|
||||
//
|
||||
// The following code is based on Rust’s [compiler-builtins crate]
|
||||
// (https://github.com/rust-lang-nursery/compiler-builtins) which
|
||||
// provides runtime functions for the Rust programs. The Rust
|
||||
// compiler will automatically link your programs against this crate.
|
||||
//
|
||||
// We copied the implementation of '__udivmodti4()' which is an intrinsic
|
||||
// implementing division with remainder for architectures without 128-bit integer support.
|
||||
// We have done this two reasons, to work around [bad optimization by LLVM]
|
||||
// (https://github.com/rust-lang/rust/issues/44545) and to allow function
|
||||
// inlining which doesn’t happen with the intrinsic.
|
||||
|
||||
#[inline]
|
||||
pub fn udivmod_1e19(n: u128) -> (u128, u64) {
|
||||
let d = 10_000_000_000_000_000_000_u64; // 10^19
|
||||
|
||||
let high = (n >> 64) as u64;
|
||||
if high == 0 {
|
||||
let low = n as u64;
|
||||
return ((low / d) as u128, low % d);
|
||||
}
|
||||
|
||||
let sr = 65 - high.leading_zeros();
|
||||
|
||||
// 2 <= sr <= 65
|
||||
let mut q: u128 = n << (128 - sr);
|
||||
let mut r: u128 = n >> sr;
|
||||
let mut carry: u64 = 0;
|
||||
|
||||
// Don't use a range because they may generate references to memcpy in unoptimized code
|
||||
//
|
||||
// Loop invariants: r < d; carry is 0 or 1
|
||||
let mut i = 0;
|
||||
while i < sr {
|
||||
i += 1;
|
||||
|
||||
// r:q = ((r:q) << 1) | carry
|
||||
r = (r << 1) | (q >> 127);
|
||||
q = (q << 1) | carry as u128;
|
||||
|
||||
// carry = 0
|
||||
// if r >= d {
|
||||
// r -= d;
|
||||
// carry = 1;
|
||||
// }
|
||||
let s = (d as u128).wrapping_sub(r).wrapping_sub(1) as i128 >> 127;
|
||||
carry = (s & 1) as u64;
|
||||
r -= (d as u128) & s as u128;
|
||||
}
|
||||
|
||||
((q << 1) | carry as u128, r as u64)
|
||||
}
|
47
third_party/rust/itoa/tests/test.rs
vendored
47
third_party/rust/itoa/tests/test.rs
vendored
@ -1,25 +1,50 @@
|
||||
#![cfg_attr(feature = "i128", feature(i128_type, i128))]
|
||||
|
||||
#![cfg_attr(feature = "cargo-clippy", allow(cast_lossless, string_lit_as_bytes))]
|
||||
|
||||
#![allow(non_snake_case)]
|
||||
|
||||
extern crate itoa;
|
||||
|
||||
macro_rules! test {
|
||||
($($name:ident($value:expr, $expected:expr),)*) => {
|
||||
(
|
||||
$(
|
||||
$(#[$attr:meta])*
|
||||
$name:ident($value:expr, $expected:expr)
|
||||
),*
|
||||
) => {
|
||||
$(
|
||||
$(#[$attr])*
|
||||
#[test]
|
||||
fn $name() {
|
||||
let mut buf = [b'\0'; 20];
|
||||
let len = itoa::write(&mut buf[..], $value).unwrap();
|
||||
assert_eq!(&buf[0..len], $expected.as_bytes());
|
||||
#[cfg(feature = "std")]
|
||||
{
|
||||
let mut buf = [b'\0'; 40];
|
||||
let len = itoa::write(&mut buf[..], $value).unwrap();
|
||||
assert_eq!(&buf[0..len], $expected.as_bytes());
|
||||
}
|
||||
|
||||
let mut s = String::new();
|
||||
itoa::fmt(&mut s, $value).unwrap();
|
||||
assert_eq!(s, $expected);
|
||||
}
|
||||
)*
|
||||
}
|
||||
}
|
||||
|
||||
test!(
|
||||
test_0u64(0u64, "0"),
|
||||
test_HALFu64(<u32>::max_value() as u64, "4294967295"),
|
||||
test_MAXu64(<u64>::max_value(), "18446744073709551615"),
|
||||
test!{
|
||||
test_u64_0(0u64, "0"),
|
||||
test_u64_half(<u32>::max_value() as u64, "4294967295"),
|
||||
test_u64_max(<u64>::max_value(), "18446744073709551615"),
|
||||
test_i64_min(<i64>::min_value(), "-9223372036854775808"),
|
||||
|
||||
test_0i16(0i16, "0"),
|
||||
test_MINi16(<i16>::min_value(), "-32768"),
|
||||
);
|
||||
test_i16_0(0i16, "0"),
|
||||
test_i16_min(<i16>::min_value(), "-32768"),
|
||||
|
||||
#[cfg(feature = "i128")]
|
||||
test_u128_0(0u128, "0"),
|
||||
#[cfg(feature = "i128")]
|
||||
test_u128_max(<u128>::max_value(), "340282366920938463463374607431768211455"),
|
||||
#[cfg(feature = "i128")]
|
||||
test_i128_min(<i128>::min_value(), "-170141183460469231731687303715884105728")
|
||||
}
|
||||
|
@ -1 +1 @@
|
||||
{"files":{"Cargo.toml":"cca09c175616b8390468aae4db4cb82688934de6f9e8bb70d7765e775d1304c9","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"7dc6376a88195594cd6b43cb891aad10f57144ff737178b55d046aa04739b43a","src/bound.rs":"44373ac15601ad92d7862fa33b59219bce111a5d3d8a1de6386e3490a8e4fbf5","src/de.rs":"fbe74de7a3bbcfe2128f016782d24b0ba925f7976563766f728744889d107020","src/fragment.rs":"4e34eca12e6ac4bd89f55e85786cfb677e98182f21ce1f51c0573bca5a8bcd27","src/lib.rs":"389815c14539bc1b394a53fd838a2d97d10def55acf034b67e87435c9d8287fa","src/ser.rs":"190bd80a820cf05155506c34bf5f512c26bae10f67b5877929b0b859d70a8431"},"package":null}
|
||||
{"files":{"Cargo.toml":"cca09c175616b8390468aae4db4cb82688934de6f9e8bb70d7765e775d1304c9","LICENSE-APACHE":"154397a08d0cb342110281129971868cd562542d0780b0d10722788cd11a1399","LICENSE-MIT":"72af89a828df52a9dcc42512ed64663b3b8d7961dd7a5586d44478eede82bc7a","README.md":"dbcc210d7f4962499db6d4cfa18658e26d05ee700c962a811cac911f095e22fd","src/bound.rs":"44373ac15601ad92d7862fa33b59219bce111a5d3d8a1de6386e3490a8e4fbf5","src/de.rs":"fbe74de7a3bbcfe2128f016782d24b0ba925f7976563766f728744889d107020","src/fragment.rs":"4e34eca12e6ac4bd89f55e85786cfb677e98182f21ce1f51c0573bca5a8bcd27","src/lib.rs":"389815c14539bc1b394a53fd838a2d97d10def55acf034b67e87435c9d8287fa","src/ser.rs":"190bd80a820cf05155506c34bf5f512c26bae10f67b5877929b0b859d70a8431"},"package":null}
|
202
third_party/rust/serde_derive/LICENSE-APACHE
vendored
202
third_party/rust/serde_derive/LICENSE-APACHE
vendored
@ -1,201 +1 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
../LICENSE-APACHE
|
26
third_party/rust/serde_derive/LICENSE-MIT
vendored
26
third_party/rust/serde_derive/LICENSE-MIT
vendored
@ -1,25 +1 @@
|
||||
Copyright (c) 2014 The Rust Project Developers
|
||||
|
||||
Permission is hereby granted, free of charge, to any
|
||||
person obtaining a copy of this software and associated
|
||||
documentation files (the "Software"), to deal in the
|
||||
Software without restriction, including without
|
||||
limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software
|
||||
is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice
|
||||
shall be included in all copies or substantial portions
|
||||
of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
|
||||
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
||||
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
|
||||
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
../LICENSE-MIT
|
103
third_party/rust/serde_derive/README.md
vendored
103
third_party/rust/serde_derive/README.md
vendored
@ -1,102 +1 @@
|
||||
# Serde   [![Build Status]][travis] [![Latest Version]][crates.io]
|
||||
|
||||
[Build Status]: https://api.travis-ci.org/serde-rs/serde.svg?branch=master
|
||||
[travis]: https://travis-ci.org/serde-rs/serde
|
||||
[Latest Version]: https://img.shields.io/crates/v/serde.svg
|
||||
[crates.io]: https://crates.io/crates/serde
|
||||
|
||||
**Serde is a framework for *ser*ializing and *de*serializing Rust data structures efficiently and generically.**
|
||||
|
||||
---
|
||||
|
||||
You may be looking for:
|
||||
|
||||
- [An overview of Serde](https://serde.rs/)
|
||||
- [Data formats supported by Serde](https://serde.rs/#data-formats)
|
||||
- [Setting up `#[derive(Serialize, Deserialize)]`](https://serde.rs/codegen.html)
|
||||
- [Examples](https://serde.rs/examples.html)
|
||||
- [API documentation](https://docs.serde.rs/serde/)
|
||||
- [Release notes](https://github.com/serde-rs/serde/releases)
|
||||
|
||||
## Serde in action
|
||||
|
||||
<details>
|
||||
<summary>
|
||||
Click to show Cargo.toml.
|
||||
<a href="http://play.integer32.com/?gist=9003c5b88c1f4989941925d7190c6eec" target="_blank">Run this code in the playground.</a>
|
||||
</summary>
|
||||
|
||||
```toml
|
||||
[dependencies]
|
||||
|
||||
# The core APIs, including the Serialize and Deserialize traits. Always
|
||||
# required when using Serde.
|
||||
serde = "1.0"
|
||||
|
||||
# Support for #[derive(Serialize, Deserialize)]. Required if you want Serde
|
||||
# to work for structs and enums defined in your crate.
|
||||
serde_derive = "1.0"
|
||||
|
||||
# Each data format lives in its own crate; the sample code below uses JSON
|
||||
# but you may be using a different one.
|
||||
serde_json = "1.0"
|
||||
```
|
||||
|
||||
</details>
|
||||
<p></p>
|
||||
|
||||
```rust
|
||||
#[macro_use]
|
||||
extern crate serde_derive;
|
||||
|
||||
extern crate serde;
|
||||
extern crate serde_json;
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
struct Point {
|
||||
x: i32,
|
||||
y: i32,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let point = Point { x: 1, y: 2 };
|
||||
|
||||
// Convert the Point to a JSON string.
|
||||
let serialized = serde_json::to_string(&point).unwrap();
|
||||
|
||||
// Prints serialized = {"x":1,"y":2}
|
||||
println!("serialized = {}", serialized);
|
||||
|
||||
// Convert the JSON string back to a Point.
|
||||
let deserialized: Point = serde_json::from_str(&serialized).unwrap();
|
||||
|
||||
// Prints deserialized = Point { x: 1, y: 2 }
|
||||
println!("deserialized = {:?}", deserialized);
|
||||
}
|
||||
```
|
||||
|
||||
## Getting help
|
||||
|
||||
Serde developers live in the #serde channel on
|
||||
[`irc.mozilla.org`](https://wiki.mozilla.org/IRC). The #rust channel is also a
|
||||
good resource with generally faster response time but less specific knowledge
|
||||
about Serde. If IRC is not your thing or you don't get a good response, we are
|
||||
happy to respond to [GitHub issues](https://github.com/serde-rs/serde/issues/new)
|
||||
as well.
|
||||
|
||||
## License
|
||||
|
||||
Serde is licensed under either of
|
||||
|
||||
* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
|
||||
http://www.apache.org/licenses/LICENSE-2.0)
|
||||
* MIT license ([LICENSE-MIT](LICENSE-MIT) or
|
||||
http://opensource.org/licenses/MIT)
|
||||
|
||||
at your option.
|
||||
|
||||
### Contribution
|
||||
|
||||
Unless you explicitly state otherwise, any contribution intentionally submitted
|
||||
for inclusion in Serde by you, as defined in the Apache-2.0 license, shall be
|
||||
dual licensed as above, without any additional terms or conditions.
|
||||
../README.md
|
@ -1 +1 @@
|
||||
{"files":{"Cargo.toml":"b9774130c25f51069e3d6d1617d9bbb63d89caf11a30dce332d4553f73f0d07c","LICENSE-APACHE":"a60eea817514531668d7e00765731449fe14d059d3249e0bc93b36de45f759f2","LICENSE-MIT":"6485b8ed310d3f0340bf1ad1f47645069ce4069dcc6bb46c7d5c6faf41de1fdb","README.md":"7dc6376a88195594cd6b43cb891aad10f57144ff737178b55d046aa04739b43a","src/ast.rs":"30d0f819638c1e7482529f3449980e116cd106ad5f1b5552f653390af5387ba3","src/attr.rs":"0a18342c91f03960620f7baa307937806c17d52564f3dbe234c3e67480242d6a","src/case.rs":"03a97fc3996614153cc5bbd33b5df9d55954407c4d37c5a656f70cbc76817708","src/check.rs":"a7f296d4ca97eee073c7104d888b15022d279a2a04c27dacd11afaf897858461","src/ctxt.rs":"30b38bc10c9d90ec1186ad4ab2159339d65bfaa5a1a51b5900b0ca52fbe526d1","src/lib.rs":"9e4fbabbdbd0a5c7fd486bfd0715eb8278cc2a07a8cf5e5fdbdf6a543d123081"},"package":null}
|
||||
{"files":{"Cargo.toml":"b9774130c25f51069e3d6d1617d9bbb63d89caf11a30dce332d4553f73f0d07c","LICENSE-APACHE":"154397a08d0cb342110281129971868cd562542d0780b0d10722788cd11a1399","LICENSE-MIT":"72af89a828df52a9dcc42512ed64663b3b8d7961dd7a5586d44478eede82bc7a","README.md":"dbcc210d7f4962499db6d4cfa18658e26d05ee700c962a811cac911f095e22fd","src/ast.rs":"30d0f819638c1e7482529f3449980e116cd106ad5f1b5552f653390af5387ba3","src/attr.rs":"0a18342c91f03960620f7baa307937806c17d52564f3dbe234c3e67480242d6a","src/case.rs":"03a97fc3996614153cc5bbd33b5df9d55954407c4d37c5a656f70cbc76817708","src/check.rs":"a7f296d4ca97eee073c7104d888b15022d279a2a04c27dacd11afaf897858461","src/ctxt.rs":"30b38bc10c9d90ec1186ad4ab2159339d65bfaa5a1a51b5900b0ca52fbe526d1","src/lib.rs":"9e4fbabbdbd0a5c7fd486bfd0715eb8278cc2a07a8cf5e5fdbdf6a543d123081"},"package":null}
|
@ -1,201 +1 @@
|
||||
Apache License
|
||||
Version 2.0, January 2004
|
||||
http://www.apache.org/licenses/
|
||||
|
||||
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||
|
||||
1. Definitions.
|
||||
|
||||
"License" shall mean the terms and conditions for use, reproduction,
|
||||
and distribution as defined by Sections 1 through 9 of this document.
|
||||
|
||||
"Licensor" shall mean the copyright owner or entity authorized by
|
||||
the copyright owner that is granting the License.
|
||||
|
||||
"Legal Entity" shall mean the union of the acting entity and all
|
||||
other entities that control, are controlled by, or are under common
|
||||
control with that entity. For the purposes of this definition,
|
||||
"control" means (i) the power, direct or indirect, to cause the
|
||||
direction or management of such entity, whether by contract or
|
||||
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||
|
||||
"You" (or "Your") shall mean an individual or Legal Entity
|
||||
exercising permissions granted by this License.
|
||||
|
||||
"Source" form shall mean the preferred form for making modifications,
|
||||
including but not limited to software source code, documentation
|
||||
source, and configuration files.
|
||||
|
||||
"Object" form shall mean any form resulting from mechanical
|
||||
transformation or translation of a Source form, including but
|
||||
not limited to compiled object code, generated documentation,
|
||||
and conversions to other media types.
|
||||
|
||||
"Work" shall mean the work of authorship, whether in Source or
|
||||
Object form, made available under the License, as indicated by a
|
||||
copyright notice that is included in or attached to the work
|
||||
(an example is provided in the Appendix below).
|
||||
|
||||
"Derivative Works" shall mean any work, whether in Source or Object
|
||||
form, that is based on (or derived from) the Work and for which the
|
||||
editorial revisions, annotations, elaborations, or other modifications
|
||||
represent, as a whole, an original work of authorship. For the purposes
|
||||
of this License, Derivative Works shall not include works that remain
|
||||
separable from, or merely link (or bind by name) to the interfaces of,
|
||||
the Work and Derivative Works thereof.
|
||||
|
||||
"Contribution" shall mean any work of authorship, including
|
||||
the original version of the Work and any modifications or additions
|
||||
to that Work or Derivative Works thereof, that is intentionally
|
||||
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||
or by an individual or Legal Entity authorized to submit on behalf of
|
||||
the copyright owner. For the purposes of this definition, "submitted"
|
||||
means any form of electronic, verbal, or written communication sent
|
||||
to the Licensor or its representatives, including but not limited to
|
||||
communication on electronic mailing lists, source code control systems,
|
||||
and issue tracking systems that are managed by, or on behalf of, the
|
||||
Licensor for the purpose of discussing and improving the Work, but
|
||||
excluding communication that is conspicuously marked or otherwise
|
||||
designated in writing by the copyright owner as "Not a Contribution."
|
||||
|
||||
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||
on behalf of whom a Contribution has been received by Licensor and
|
||||
subsequently incorporated within the Work.
|
||||
|
||||
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
copyright license to reproduce, prepare Derivative Works of,
|
||||
publicly display, publicly perform, sublicense, and distribute the
|
||||
Work and such Derivative Works in Source or Object form.
|
||||
|
||||
3. Grant of Patent License. Subject to the terms and conditions of
|
||||
this License, each Contributor hereby grants to You a perpetual,
|
||||
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||
(except as stated in this section) patent license to make, have made,
|
||||
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||
where such license applies only to those patent claims licensable
|
||||
by such Contributor that are necessarily infringed by their
|
||||
Contribution(s) alone or by combination of their Contribution(s)
|
||||
with the Work to which such Contribution(s) was submitted. If You
|
||||
institute patent litigation against any entity (including a
|
||||
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||
or a Contribution incorporated within the Work constitutes direct
|
||||
or contributory patent infringement, then any patent licenses
|
||||
granted to You under this License for that Work shall terminate
|
||||
as of the date such litigation is filed.
|
||||
|
||||
4. Redistribution. You may reproduce and distribute copies of the
|
||||
Work or Derivative Works thereof in any medium, with or without
|
||||
modifications, and in Source or Object form, provided that You
|
||||
meet the following conditions:
|
||||
|
||||
(a) You must give any other recipients of the Work or
|
||||
Derivative Works a copy of this License; and
|
||||
|
||||
(b) You must cause any modified files to carry prominent notices
|
||||
stating that You changed the files; and
|
||||
|
||||
(c) You must retain, in the Source form of any Derivative Works
|
||||
that You distribute, all copyright, patent, trademark, and
|
||||
attribution notices from the Source form of the Work,
|
||||
excluding those notices that do not pertain to any part of
|
||||
the Derivative Works; and
|
||||
|
||||
(d) If the Work includes a "NOTICE" text file as part of its
|
||||
distribution, then any Derivative Works that You distribute must
|
||||
include a readable copy of the attribution notices contained
|
||||
within such NOTICE file, excluding those notices that do not
|
||||
pertain to any part of the Derivative Works, in at least one
|
||||
of the following places: within a NOTICE text file distributed
|
||||
as part of the Derivative Works; within the Source form or
|
||||
documentation, if provided along with the Derivative Works; or,
|
||||
within a display generated by the Derivative Works, if and
|
||||
wherever such third-party notices normally appear. The contents
|
||||
of the NOTICE file are for informational purposes only and
|
||||
do not modify the License. You may add Your own attribution
|
||||
notices within Derivative Works that You distribute, alongside
|
||||
or as an addendum to the NOTICE text from the Work, provided
|
||||
that such additional attribution notices cannot be construed
|
||||
as modifying the License.
|
||||
|
||||
You may add Your own copyright statement to Your modifications and
|
||||
may provide additional or different license terms and conditions
|
||||
for use, reproduction, or distribution of Your modifications, or
|
||||
for any such Derivative Works as a whole, provided Your use,
|
||||
reproduction, and distribution of the Work otherwise complies with
|
||||
the conditions stated in this License.
|
||||
|
||||
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||
any Contribution intentionally submitted for inclusion in the Work
|
||||
by You to the Licensor shall be under the terms and conditions of
|
||||
this License, without any additional terms or conditions.
|
||||
Notwithstanding the above, nothing herein shall supersede or modify
|
||||
the terms of any separate license agreement you may have executed
|
||||
with Licensor regarding such Contributions.
|
||||
|
||||
6. Trademarks. This License does not grant permission to use the trade
|
||||
names, trademarks, service marks, or product names of the Licensor,
|
||||
except as required for reasonable and customary use in describing the
|
||||
origin of the Work and reproducing the content of the NOTICE file.
|
||||
|
||||
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||
agreed to in writing, Licensor provides the Work (and each
|
||||
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||
implied, including, without limitation, any warranties or conditions
|
||||
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||
appropriateness of using or redistributing the Work and assume any
|
||||
risks associated with Your exercise of permissions under this License.
|
||||
|
||||
8. Limitation of Liability. In no event and under no legal theory,
|
||||
whether in tort (including negligence), contract, or otherwise,
|
||||
unless required by applicable law (such as deliberate and grossly
|
||||
negligent acts) or agreed to in writing, shall any Contributor be
|
||||
liable to You for damages, including any direct, indirect, special,
|
||||
incidental, or consequential damages of any character arising as a
|
||||
result of this License or out of the use or inability to use the
|
||||
Work (including but not limited to damages for loss of goodwill,
|
||||
work stoppage, computer failure or malfunction, or any and all
|
||||
other commercial damages or losses), even if such Contributor
|
||||
has been advised of the possibility of such damages.
|
||||
|
||||
9. Accepting Warranty or Additional Liability. While redistributing
|
||||
the Work or Derivative Works thereof, You may choose to offer,
|
||||
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||
or other liability obligations and/or rights consistent with this
|
||||
License. However, in accepting such obligations, You may act only
|
||||
on Your own behalf and on Your sole responsibility, not on behalf
|
||||
of any other Contributor, and only if You agree to indemnify,
|
||||
defend, and hold each Contributor harmless for any liability
|
||||
incurred by, or claims asserted against, such Contributor by reason
|
||||
of your accepting any such warranty or additional liability.
|
||||
|
||||
END OF TERMS AND CONDITIONS
|
||||
|
||||
APPENDIX: How to apply the Apache License to your work.
|
||||
|
||||
To apply the Apache License to your work, attach the following
|
||||
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||
replaced with your own identifying information. (Don't include
|
||||
the brackets!) The text should be enclosed in the appropriate
|
||||
comment syntax for the file format. We also recommend that a
|
||||
file or class name and description of purpose be included on the
|
||||
same "printed page" as the copyright notice for easier
|
||||
identification within third-party archives.
|
||||
|
||||
Copyright [yyyy] [name of copyright owner]
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
../LICENSE-APACHE
|
@ -1,25 +1 @@
|
||||
Copyright (c) 2014 The Rust Project Developers
|
||||
|
||||
Permission is hereby granted, free of charge, to any
|
||||
person obtaining a copy of this software and associated
|
||||
documentation files (the "Software"), to deal in the
|
||||
Software without restriction, including without
|
||||
limitation the rights to use, copy, modify, merge,
|
||||
publish, distribute, sublicense, and/or sell copies of
|
||||
the Software, and to permit persons to whom the Software
|
||||
is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice
|
||||
shall be included in all copies or substantial portions
|
||||
of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF
|
||||
ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED
|
||||
TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A
|
||||
PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
|
||||
SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
|
||||
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR
|
||||
IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
||||
DEALINGS IN THE SOFTWARE.
|
||||
../LICENSE-MIT
|
103
third_party/rust/serde_derive_internals/README.md
vendored
103
third_party/rust/serde_derive_internals/README.md
vendored
@ -1,102 +1 @@
|
||||
# Serde   [![Build Status]][travis] [![Latest Version]][crates.io]
|
||||
|
||||
[Build Status]: https://api.travis-ci.org/serde-rs/serde.svg?branch=master
|
||||
[travis]: https://travis-ci.org/serde-rs/serde
|
||||
[Latest Version]: https://img.shields.io/crates/v/serde.svg
|
||||
[crates.io]: https://crates.io/crates/serde
|
||||
|
||||
**Serde is a framework for *ser*ializing and *de*serializing Rust data structures efficiently and generically.**
|
||||
|
||||
---
|
||||
|
||||
You may be looking for:
|
||||
|
||||
- [An overview of Serde](https://serde.rs/)
|
||||
- [Data formats supported by Serde](https://serde.rs/#data-formats)
|
||||
- [Setting up `#[derive(Serialize, Deserialize)]`](https://serde.rs/codegen.html)
|
||||
- [Examples](https://serde.rs/examples.html)
|
||||
- [API documentation](https://docs.serde.rs/serde/)
|
||||
- [Release notes](https://github.com/serde-rs/serde/releases)
|
||||
|
||||
## Serde in action
|
||||
|
||||
<details>
|
||||
<summary>
|
||||
Click to show Cargo.toml.
|
||||
<a href="http://play.integer32.com/?gist=9003c5b88c1f4989941925d7190c6eec" target="_blank">Run this code in the playground.</a>
|
||||
</summary>
|
||||
|
||||
```toml
|
||||
[dependencies]
|
||||
|
||||
# The core APIs, including the Serialize and Deserialize traits. Always
|
||||
# required when using Serde.
|
||||
serde = "1.0"
|
||||
|
||||
# Support for #[derive(Serialize, Deserialize)]. Required if you want Serde
|
||||
# to work for structs and enums defined in your crate.
|
||||
serde_derive = "1.0"
|
||||
|
||||
# Each data format lives in its own crate; the sample code below uses JSON
|
||||
# but you may be using a different one.
|
||||
serde_json = "1.0"
|
||||
```
|
||||
|
||||
</details>
|
||||
<p></p>
|
||||
|
||||
```rust
|
||||
#[macro_use]
|
||||
extern crate serde_derive;
|
||||
|
||||
extern crate serde;
|
||||
extern crate serde_json;
|
||||
|
||||
#[derive(Serialize, Deserialize, Debug)]
|
||||
struct Point {
|
||||
x: i32,
|
||||
y: i32,
|
||||
}
|
||||
|
||||
fn main() {
|
||||
let point = Point { x: 1, y: 2 };
|
||||
|
||||
// Convert the Point to a JSON string.
|
||||
let serialized = serde_json::to_string(&point).unwrap();
|
||||
|
||||
// Prints serialized = {"x":1,"y":2}
|
||||
println!("serialized = {}", serialized);
|
||||
|
||||
// Convert the JSON string back to a Point.
|
||||
let deserialized: Point = serde_json::from_str(&serialized).unwrap();
|
||||
|
||||
// Prints deserialized = Point { x: 1, y: 2 }
|
||||
println!("deserialized = {:?}", deserialized);
|
||||
}
|
||||
```
|
||||
|
||||
## Getting help
|
||||
|
||||
Serde developers live in the #serde channel on
|
||||
[`irc.mozilla.org`](https://wiki.mozilla.org/IRC). The #rust channel is also a
|
||||
good resource with generally faster response time but less specific knowledge
|
||||
about Serde. If IRC is not your thing or you don't get a good response, we are
|
||||
happy to respond to [GitHub issues](https://github.com/serde-rs/serde/issues/new)
|
||||
as well.
|
||||
|
||||
## License
|
||||
|
||||
Serde is licensed under either of
|
||||
|
||||
* Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or
|
||||
http://www.apache.org/licenses/LICENSE-2.0)
|
||||
* MIT license ([LICENSE-MIT](LICENSE-MIT) or
|
||||
http://opensource.org/licenses/MIT)
|
||||
|
||||
at your option.
|
||||
|
||||
### Contribution
|
||||
|
||||
Unless you explicitly state otherwise, any contribution intentionally submitted
|
||||
for inclusion in Serde by you, as defined in the Apache-2.0 license, shall be
|
||||
dual licensed as above, without any additional terms or conditions.
|
||||
../README.md
|
Loading…
Reference in New Issue
Block a user