gettc 1.10 → 2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +4 -4
- data/bin/gettc +60 -69
- data/dist/config.yml +1 -1
- data/dist/include/cpp/engine.rb +78 -86
- data/dist/include/cpp/topcoder +236 -236
- data/dist/include/go/engine.rb +53 -61
- data/dist/include/haskell/engine.rb +112 -122
- data/dist/include/java/engine.rb +187 -184
- data/dist/include/javascript/engine.rb +26 -30
- data/dist/include/javascript/topcoder.js +3 -3
- data/dist/include/javascript/topcoder/errors.js +5 -5
- data/dist/include/javascript/topcoder/reader.js +188 -165
- data/dist/include/javascript/topcoder/writer.js +37 -33
- data/dist/include/python/engine.rb +43 -52
- data/dist/include/python/topcoder/__init__.pyc +0 -0
- data/dist/include/python/topcoder/__pycache__/__init__.cpython-34.pyc +0 -0
- data/dist/include/python/topcoder/__pycache__/errors.cpython-34.pyc +0 -0
- data/dist/include/python/topcoder/__pycache__/reader.cpython-34.pyc +0 -0
- data/dist/include/python/topcoder/__pycache__/writer.cpython-34.pyc +0 -0
- data/dist/include/python/topcoder/errors.pyc +0 -0
- data/dist/include/python/topcoder/reader.pyc +0 -0
- data/dist/include/python/topcoder/writer.pyc +0 -0
- data/dist/include/ruby/engine.rb +47 -52
- data/dist/include/ruby/topcoder/reader.rb +205 -193
- data/dist/include/ruby/topcoder/writer.rb +39 -37
- data/dist/template/bin/runner.rb +146 -151
- data/dist/template/bin/runner.sh +96 -96
- data/dist/template/prob/{name}.html +1 -1
- data/dist/template/solve/cpp/{name}.cpp +3 -4
- data/dist/template/solve/cpp/{name}Solver.cpp +14 -14
- data/dist/template/solve/go/{name}/{name}.go +3 -3
- data/dist/template/solve/go/{name}Solver.go +2 -2
- data/dist/template/solve/haskell/{name}.hs +6 -6
- data/dist/template/solve/haskell/{name}Solver.hs +10 -10
- data/dist/template/solve/java/{name}.java +4 -4
- data/dist/template/solve/java/{name}Solver.java +4 -4
- data/dist/template/solve/javascript/{name}.js +4 -6
- data/dist/template/solve/javascript/{name}Solver.js +11 -9
- data/dist/template/solve/python/{name}.py +1 -1
- data/dist/template/solve/python/{name}Solver.py +2 -2
- data/dist/template/solve/ruby/{name}.rb +4 -4
- data/dist/template/solve/ruby/{name}Solver.rb +14 -17
- data/dist/template/util/check/check.cpp +19 -19
- data/{core/lib → lib}/gettc.rb +0 -0
- data/lib/gettc/account.rb +14 -0
- data/lib/gettc/download.rb +211 -0
- data/lib/gettc/generate.rb +156 -0
- data/lib/gettc/parse.rb +237 -0
- data/lib/gettc/print.rb +54 -0
- data/lib/gettc/problem.rb +39 -0
- data/lib/gettc/signature.rb +63 -0
- data/lib/gettc/types.rb +93 -0
- data/lib/version.rb +3 -0
- data/test/gettc/download_test.rb +61 -0
- data/test/gettc/generate_test.rb +70 -0
- data/test/gettc/parse_test.rb +78 -0
- data/test/gettc/signature_test.rb +71 -0
- data/test/gettc/types_test.rb +31 -0
- metadata +28 -23
- data/core/lib/gettc/download.rb +0 -130
- data/core/lib/gettc/generate.rb +0 -145
- data/core/lib/gettc/parse.rb +0 -233
- data/core/lib/gettc/print.rb +0 -56
- data/core/lib/gettc/problem.rb +0 -33
- data/core/lib/gettc/signature.rb +0 -55
- data/core/lib/gettc/types.rb +0 -83
- data/core/lib/version.rb +0 -3
- data/core/test/gettc/download_test.rb +0 -29
- data/core/test/gettc/generate_test.rb +0 -31
- data/core/test/gettc/parse_test.rb +0 -104
- data/core/test/gettc/signature_test.rb +0 -54
- data/core/test/gettc/types_test.rb +0 -28
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 1b7ea56d04d293fac9836322b3bd90bb3c0e19b3
|
4
|
+
data.tar.gz: 2e2b323f24c59f0976c1f73b9a822ccbd7e82a9e
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce0bf1a1b452710291a014d2b52fa10af2170c2a6cff2e9d2602ce8affa75df61b08b198377be00102cc5f2c032ca50537e0aa330e92e8263594ef491f22061f
|
7
|
+
data.tar.gz: 18c9c44a6b39463d2d797e055614740dc72715ad4556436fee2062aa3588cd56aa10476375c2ed79b3da01c722b7f9c9c63d6c2609115712ed338656310fb56a
|
data/bin/gettc
CHANGED
@@ -1,90 +1,81 @@
|
|
1
1
|
#! /usr/bin/env ruby
|
2
2
|
|
3
|
-
require "gettc"
|
3
|
+
require "gettc"
|
4
4
|
include Gettc
|
5
5
|
|
6
6
|
require "rubygems"
|
7
|
-
require "fileutils"
|
8
|
-
require "yaml"
|
9
|
-
|
10
|
-
def init
|
11
|
-
$config_d = ENV.fetch "GETTC_HOME", File.expand_path("~/.gettc")
|
12
|
-
gem_d = Gem.loaded_specs["gettc"]
|
13
|
-
if gem_d.nil? then
|
14
|
-
$root_d = File.join File.dirname(__FILE__), "../"
|
15
|
-
else
|
16
|
-
$root_d = gem_d.full_gem_path
|
17
|
-
end
|
18
|
-
end
|
7
|
+
require "fileutils"
|
8
|
+
require "yaml"
|
19
9
|
|
20
10
|
def replace_config
|
21
|
-
|
22
|
-
|
23
|
-
FileUtils.cp_r default_d, $config_d
|
11
|
+
FileUtils.mkdir($config_dir)
|
12
|
+
FileUtils.cp_r(File.join($root_dir, "dist/."), $config_dir)
|
24
13
|
end
|
25
14
|
|
26
15
|
def load_config
|
27
|
-
|
28
|
-
|
16
|
+
replace_config unless Dir.exists?($config_dir)
|
17
|
+
config = YAML.load_file(File.join($config_dir, "config.yml"))
|
29
18
|
|
30
|
-
|
31
|
-
|
32
|
-
version = Gem::Version.new version
|
33
|
-
end
|
19
|
+
version = config["version"]
|
20
|
+
version = Gem::Version.new(version) unless version.nil?
|
34
21
|
|
35
|
-
|
36
|
-
|
37
|
-
|
38
|
-
|
22
|
+
if version.nil? || version < Gem::Version.new(VERSION)
|
23
|
+
FileUtils.rm_rf($config_dir)
|
24
|
+
replace_config
|
25
|
+
end
|
39
26
|
|
40
|
-
|
41
|
-
|
42
|
-
|
27
|
+
$account = Account.new(config["username"], config["password"])
|
28
|
+
end
|
29
|
+
|
30
|
+
def init
|
31
|
+
$config_dir = ENV.fetch("GETTC_HOME", File.expand_path("~/.gettc"))
|
32
|
+
gem_d = Gem.loaded_specs["gettc"]
|
33
|
+
$root_dir = gem_d ? gem_d.full_gem_path : File.join(File.dirname(__FILE__), "../")
|
34
|
+
|
35
|
+
load_config
|
36
|
+
$downloader = Downloader.new($account)
|
37
|
+
$parser = Parser.new($downloader)
|
38
|
+
$generator = Generator.new($config_dir, Dir.getwd)
|
39
|
+
end
|
40
|
+
|
41
|
+
def gettc(id)
|
42
|
+
problem = $parser.parse(id)
|
43
|
+
puts "#{problem.name} was used for #{problem.source}."
|
44
|
+
$generator.generate(problem)
|
45
|
+
|
46
|
+
puts "All done. Start solving with:"
|
47
|
+
puts " $ cd #{problem.name}/solve/<your_language>"
|
48
|
+
puts " $ make demo"
|
49
|
+
rescue TemplateError => err
|
50
|
+
puts err
|
51
|
+
end
|
43
52
|
|
44
53
|
def main
|
45
|
-
|
46
|
-
|
54
|
+
prog = File.basename(__FILE__)
|
55
|
+
usage = <<-eos.strip
|
47
56
|
gettc <id>: Generate a solution for the TopCoder problem with that ID, eg 11138.
|
48
57
|
gettc version: Print version string.
|
49
58
|
gettc reset: Bring all settings to default state.
|
50
|
-
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
|
67
|
-
|
68
|
-
|
69
|
-
|
70
|
-
print "Downloading problem to raw HTML ... "
|
71
|
-
html = robot.download_problem id
|
72
|
-
puts "Done"
|
73
|
-
|
74
|
-
print "Parsing problem from raw HTML ... "
|
75
|
-
prob = parser.parse html
|
76
|
-
puts "Done"
|
77
|
-
|
78
|
-
print "Generating problem directory for #{prob.name} ... "
|
79
|
-
generator.generate prob
|
80
|
-
puts "Done"
|
81
|
-
rescue TemplateError => terr
|
82
|
-
puts terr
|
83
|
-
rescue StandardError => err
|
84
|
-
puts err
|
85
|
-
exit -1
|
86
|
-
end
|
87
|
-
end
|
59
|
+
eos
|
60
|
+
|
61
|
+
if ARGV.empty?
|
62
|
+
puts usage
|
63
|
+
return
|
64
|
+
end
|
65
|
+
|
66
|
+
command = ARGV[0]
|
67
|
+
case command
|
68
|
+
when "version"
|
69
|
+
puts VERSION
|
70
|
+
when "reset"
|
71
|
+
FileUtils.rm_rf($config_dir)
|
72
|
+
replace_config
|
73
|
+
else
|
74
|
+
gettc(command.to_i)
|
75
|
+
end
|
76
|
+
rescue StandardError => err
|
77
|
+
puts err
|
78
|
+
exit -1
|
88
79
|
end
|
89
80
|
|
90
81
|
init
|
data/dist/config.yml
CHANGED
data/dist/include/cpp/engine.rb
CHANGED
@@ -1,97 +1,89 @@
|
|
1
1
|
require "gettc/types"
|
2
2
|
|
3
3
|
module Gettc
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
4
|
+
class Type
|
5
|
+
def to_cpp
|
6
|
+
if self.is_a?(TArray)
|
7
|
+
ret = "vector<" << subtype.to_cpp
|
8
|
+
ret << " " if subtype.is_a?(TArray)
|
9
|
+
ret << ">"
|
10
|
+
return ret
|
11
|
+
end
|
12
12
|
|
13
|
-
|
14
|
-
|
15
|
-
|
16
|
-
|
17
|
-
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
13
|
+
case self
|
14
|
+
when TInt
|
15
|
+
"int"
|
16
|
+
when TLong
|
17
|
+
"int64"
|
18
|
+
when TFloat
|
19
|
+
"float"
|
20
|
+
when TDouble
|
21
|
+
"double"
|
22
|
+
when TChar
|
23
|
+
"char"
|
24
|
+
when TString
|
25
|
+
"string"
|
26
|
+
when TBoolean
|
27
|
+
"bool"
|
28
|
+
else
|
29
|
+
"unknown"
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
def dumb_cpp
|
34
|
+
return "#{to_cpp}()" if self.is_a?(TArray)
|
35
|
+
|
36
|
+
case self
|
37
|
+
when TInt, TLong, TFloat, TDouble
|
38
|
+
"0"
|
39
|
+
when TChar
|
40
|
+
"'$'"
|
41
|
+
when TString
|
42
|
+
'"$"'
|
43
|
+
when TBoolean
|
44
|
+
"true"
|
45
|
+
else
|
46
|
+
"Nil"
|
47
|
+
end
|
48
|
+
end
|
49
|
+
end
|
29
50
|
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
51
|
+
class Signature
|
52
|
+
def to_cpp(declaring = false)
|
53
|
+
ret = type.to_cpp
|
54
|
+
ret << " "
|
55
|
+
ret << "const &" if declaring && type.obj?
|
56
|
+
ret << name
|
57
|
+
ret
|
58
|
+
end
|
59
|
+
end
|
36
60
|
|
37
|
-
|
38
|
-
|
39
|
-
|
40
|
-
|
41
|
-
|
42
|
-
when TString
|
43
|
-
return '"$"'
|
44
|
-
when TBoolean then
|
45
|
-
return "true"
|
46
|
-
end
|
61
|
+
class CppEngine
|
62
|
+
def initialize(func, vars)
|
63
|
+
@func = func
|
64
|
+
@vars = vars
|
65
|
+
end
|
47
66
|
|
48
|
-
|
49
|
-
|
67
|
+
def declare
|
68
|
+
ret = @func.to_cpp
|
69
|
+
ret << "("
|
70
|
+
indent = " " * ret.size
|
71
|
+
ret << @vars.map { |var| var.to_cpp(true) }.join(",\n#{indent}")
|
72
|
+
ret << ")"
|
50
73
|
end
|
51
|
-
|
52
|
-
|
53
|
-
|
54
|
-
|
55
|
-
|
56
|
-
|
57
|
-
|
58
|
-
|
74
|
+
|
75
|
+
def input
|
76
|
+
@vars.map do |var|
|
77
|
+
x = var.to_cpp
|
78
|
+
x << "; tc::read(ifs, "
|
79
|
+
x << var.name
|
80
|
+
x << ");"
|
81
|
+
end.join(" tc::next(ifs);\n")
|
59
82
|
end
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
64
|
-
@vars = vars
|
65
|
-
compute_declare
|
66
|
-
compute_input
|
67
|
-
compute_output
|
68
|
-
end
|
69
|
-
private
|
70
|
-
def compute_declare
|
71
|
-
@declare = @func.to_cpp
|
72
|
-
@declare << "("
|
73
|
-
indent = " " * @declare.size
|
74
|
-
temp = @vars.map do |var|
|
75
|
-
var.to_cpp true
|
76
|
-
end
|
77
|
-
@declare << temp.join(",\n#{indent}")
|
78
|
-
@declare << ")"
|
79
|
-
end
|
80
|
-
def compute_input
|
81
|
-
temp = @vars.map do |var|
|
82
|
-
x = var.to_cpp
|
83
|
-
x << "; tc::read(ifs, "
|
84
|
-
x << var.name
|
85
|
-
x << ");"
|
86
|
-
end
|
87
|
-
@input = temp.join " tc::next(ifs);\n"
|
88
|
-
end
|
89
|
-
def compute_output
|
90
|
-
@output = "tc::show(ofs, solver." << @func.name << "("
|
91
|
-
temp = @vars.map do |var|
|
92
|
-
var.name
|
93
|
-
end
|
94
|
-
@output << temp.join(", ") << "));"
|
95
|
-
end
|
83
|
+
|
84
|
+
def output
|
85
|
+
ret = "tc::show(ofs, solver." << @func.name << "("
|
86
|
+
ret << @vars.map(&:name).join(", ") << "));"
|
96
87
|
end
|
88
|
+
end
|
97
89
|
end
|
data/dist/include/cpp/topcoder
CHANGED
@@ -13,264 +13,264 @@
|
|
13
13
|
typedef unsigned int uint;
|
14
14
|
typedef long long int64;
|
15
15
|
typedef unsigned long long uint64;
|
16
|
-
|
16
|
+
|
17
17
|
namespace TopCoder {
|
18
|
-
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
}
|
30
|
-
|
31
|
-
public:
|
32
|
-
ParseException() : message("ParseException occurred") {}
|
33
|
-
ParseException(std::string const &message) : message(message) {}
|
34
|
-
~ParseException() throw () {}
|
35
|
-
|
36
|
-
virtual const char* what() const throw() {
|
37
|
-
return message.c_str();
|
38
|
-
}
|
39
|
-
|
40
|
-
ParseException(std::string const &required, char actual,
|
41
|
-
std::string const &rest) {
|
42
|
-
buildMessage(required, actual, rest);
|
43
|
-
}
|
44
|
-
|
45
|
-
ParseException(char expected, char actual,
|
46
|
-
std::string const &rest) {
|
47
|
-
std::ostringstream oss;
|
48
|
-
oss << "Expect '" << expected << "'";
|
49
|
-
buildMessage(oss.str(), actual, rest);
|
50
|
-
}
|
51
|
-
|
52
|
-
ParseException(std::string const &required, std::string const &rest) {
|
53
|
-
std::ostringstream oss;
|
54
|
-
oss << required << " at: <" << rest << ">";
|
55
|
-
message = oss.str();
|
56
|
-
}
|
57
|
-
|
58
|
-
ParseException(char expected) {
|
59
|
-
std::ostringstream oss;
|
60
|
-
oss << "Expect '" << expected << " before end of stream";
|
61
|
-
message = oss.str();
|
62
|
-
}
|
63
|
-
};
|
64
|
-
|
65
|
-
std::string _rest(std::istream &is) {
|
66
|
-
std::ostringstream oss;
|
67
|
-
char chunk[_CHUNK_SIZE];
|
68
|
-
while (is.good()) {
|
69
|
-
is.get(chunk, _CHUNK_SIZE);
|
70
|
-
oss << chunk;
|
71
|
-
}
|
72
|
-
return oss.str();
|
73
|
-
}
|
74
|
-
|
75
|
-
void _spaces(std::istream &is) {
|
76
|
-
while (is.good()) {
|
77
|
-
int i = is.peek();
|
78
|
-
if (isspace(i)) is.ignore(1);
|
79
|
-
else break;
|
80
|
-
}
|
81
|
-
}
|
82
|
-
|
83
|
-
void _expect(std::istream &is, char expected) {
|
84
|
-
_spaces(is); char actual = is.peek();
|
85
|
-
if (expected != actual)
|
86
|
-
throw ParseException(expected, actual, _rest(is));
|
87
|
-
is.ignore(1);
|
18
|
+
const int _CHUNK_SIZE = 65536;
|
19
|
+
|
20
|
+
class ParseException: public std::exception {
|
21
|
+
private:
|
22
|
+
std::string message;
|
23
|
+
void buildMessage(std::string const &required, char actual,
|
24
|
+
std::string const &rest) {
|
25
|
+
std::ostringstream oss;
|
26
|
+
oss << required << " at: <" << rest << ">";
|
27
|
+
oss << " (got '" << actual << "')";
|
28
|
+
message = oss.str();
|
88
29
|
}
|
89
30
|
|
90
|
-
|
91
|
-
|
92
|
-
}
|
31
|
+
public:
|
32
|
+
ParseException() : message("ParseException occurred") {}
|
33
|
+
ParseException(std::string const &message) : message(message) {}
|
34
|
+
~ParseException() throw () {}
|
93
35
|
|
94
|
-
|
95
|
-
|
36
|
+
virtual const char* what() const throw() {
|
37
|
+
return message.c_str();
|
96
38
|
}
|
97
39
|
|
98
|
-
|
99
|
-
|
40
|
+
ParseException(std::string const &required, char actual,
|
41
|
+
std::string const &rest) {
|
42
|
+
buildMessage(required, actual, rest);
|
100
43
|
}
|
101
44
|
|
102
|
-
|
103
|
-
|
45
|
+
ParseException(char expected, char actual,
|
46
|
+
std::string const &rest) {
|
47
|
+
std::ostringstream oss;
|
48
|
+
oss << "Expect '" << expected << "'";
|
49
|
+
buildMessage(oss.str(), actual, rest);
|
104
50
|
}
|
105
51
|
|
106
|
-
|
107
|
-
|
52
|
+
ParseException(std::string const &required, std::string const &rest) {
|
53
|
+
std::ostringstream oss;
|
54
|
+
oss << required << " at: <" << rest << ">";
|
55
|
+
message = oss.str();
|
108
56
|
}
|
109
57
|
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
114
|
-
_expect(is, '\'');
|
115
|
-
} else {
|
116
|
-
c = ch;
|
117
|
-
}
|
118
|
-
}
|
119
|
-
|
120
|
-
void read(std::istream &is, std::string &s) {
|
121
|
-
_expect(is, '"');
|
122
|
-
std::ostringstream oss;
|
123
|
-
while (is.good()) {
|
124
|
-
char c; is.get(c);
|
125
|
-
if (c == '"') {
|
126
|
-
std::streampos pos = is.tellg();
|
127
|
-
_spaces(is);
|
128
|
-
if (is.eof()) {
|
129
|
-
s = oss.str();
|
130
|
-
return;
|
131
|
-
}
|
132
|
-
char cc; is.get(cc);
|
133
|
-
if (cc == ',' || cc == ']') {
|
134
|
-
s = oss.str();
|
135
|
-
is.unget();
|
136
|
-
return;
|
137
|
-
}
|
138
|
-
is.seekg(pos);
|
139
|
-
}
|
140
|
-
oss << c;
|
141
|
-
}
|
142
|
-
throw ParseException('"');
|
58
|
+
ParseException(char expected) {
|
59
|
+
std::ostringstream oss;
|
60
|
+
oss << "Expect '" << expected << " before end of stream";
|
61
|
+
message = oss.str();
|
143
62
|
}
|
144
|
-
|
145
|
-
|
146
|
-
|
147
|
-
|
148
|
-
|
149
|
-
|
150
|
-
|
151
|
-
|
152
|
-
|
153
|
-
|
154
|
-
|
155
|
-
|
156
|
-
|
157
|
-
|
158
|
-
|
159
|
-
|
160
|
-
|
161
|
-
|
162
|
-
|
163
|
-
|
164
|
-
|
63
|
+
};
|
64
|
+
|
65
|
+
std::string _rest(std::istream &is) {
|
66
|
+
std::ostringstream oss;
|
67
|
+
char chunk[_CHUNK_SIZE];
|
68
|
+
while (is.good()) {
|
69
|
+
is.get(chunk, _CHUNK_SIZE);
|
70
|
+
oss << chunk;
|
71
|
+
}
|
72
|
+
return oss.str();
|
73
|
+
}
|
74
|
+
|
75
|
+
void _spaces(std::istream &is) {
|
76
|
+
while (is.good()) {
|
77
|
+
int i = is.peek();
|
78
|
+
if (isspace(i)) is.ignore(1);
|
79
|
+
else break;
|
80
|
+
}
|
81
|
+
}
|
82
|
+
|
83
|
+
void _expect(std::istream &is, char expected) {
|
84
|
+
_spaces(is); char actual = is.peek();
|
85
|
+
if (expected != actual)
|
86
|
+
throw ParseException(expected, actual, _rest(is));
|
87
|
+
is.ignore(1);
|
88
|
+
}
|
89
|
+
|
90
|
+
void next(std::istream &is) {
|
91
|
+
_expect(is, ',');
|
92
|
+
}
|
93
|
+
|
94
|
+
void read(std::istream &is, int &i) {
|
95
|
+
is >> i;
|
96
|
+
}
|
97
|
+
|
98
|
+
void read(std::istream &is, int64 &l) {
|
99
|
+
is >> l;
|
100
|
+
}
|
101
|
+
|
102
|
+
void read(std::istream &is, float &f) {
|
103
|
+
is >> f;
|
104
|
+
}
|
105
|
+
|
106
|
+
void read(std::istream &is, double &d) {
|
107
|
+
is >> d;
|
108
|
+
}
|
109
|
+
|
110
|
+
void read(std::istream &is, char &c) {
|
111
|
+
_spaces(is); char ch; is.get(ch);
|
112
|
+
if (ch == '\'') {
|
113
|
+
is.get(c);
|
114
|
+
_expect(is, '\'');
|
115
|
+
} else {
|
116
|
+
c = ch;
|
165
117
|
}
|
166
|
-
|
167
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
118
|
+
}
|
119
|
+
|
120
|
+
void read(std::istream &is, std::string &s) {
|
121
|
+
_expect(is, '"');
|
122
|
+
std::ostringstream oss;
|
123
|
+
while (is.good()) {
|
124
|
+
char c; is.get(c);
|
125
|
+
if (c == '"') {
|
126
|
+
std::streampos pos = is.tellg();
|
171
127
|
_spaces(is);
|
172
|
-
|
173
|
-
|
174
|
-
|
175
|
-
return;
|
128
|
+
if (is.eof()) {
|
129
|
+
s = oss.str();
|
130
|
+
return;
|
176
131
|
}
|
177
|
-
|
178
|
-
|
179
|
-
|
180
|
-
|
181
|
-
|
182
|
-
}
|
183
|
-
if (c != ',') {
|
184
|
-
throw ParseException("Expect ',' or ']'", c, _rest(is));
|
185
|
-
}
|
186
|
-
}
|
187
|
-
throw ParseException(']');
|
188
|
-
}
|
189
|
-
|
190
|
-
void show(std::ostream &os, int i) {
|
191
|
-
os << i;
|
192
|
-
}
|
193
|
-
|
194
|
-
void show(std::ostream &os, int64 l) {
|
195
|
-
os << l;
|
196
|
-
}
|
197
|
-
|
198
|
-
void show(std::ostream &os, float f) {
|
199
|
-
os.precision(8);
|
200
|
-
os << f;
|
201
|
-
}
|
202
|
-
|
203
|
-
void show(std::ostream &os, double d) {
|
204
|
-
os.precision(16);
|
205
|
-
os << d;
|
206
|
-
}
|
207
|
-
|
208
|
-
void show(std::ostream &os, char c) {
|
209
|
-
os << '\'' << c << '\'';
|
210
|
-
}
|
211
|
-
|
212
|
-
void show(std::ostream &os, std::string const &s) {
|
213
|
-
os << '"' << s << '"';
|
214
|
-
}
|
215
|
-
|
216
|
-
void show(std::ostream &os, bool b) {
|
217
|
-
os << (b ? "true" : "false");
|
218
|
-
}
|
219
|
-
|
220
|
-
template <typename T>
|
221
|
-
void show(std::ostream &os, std::vector<T> const &v) {
|
222
|
-
typedef typename std::vector<T>::const_iterator Iterator;
|
223
|
-
bool first = true;
|
224
|
-
os << '[';
|
225
|
-
for (Iterator it = v.begin(); it != v.end(); ++it) {
|
226
|
-
if (!first) {
|
227
|
-
os << ',';
|
228
|
-
}
|
229
|
-
show(os, *it);
|
230
|
-
first = false;
|
132
|
+
char cc; is.get(cc);
|
133
|
+
if (cc == ',' || cc == ']') {
|
134
|
+
s = oss.str();
|
135
|
+
is.unget();
|
136
|
+
return;
|
231
137
|
}
|
232
|
-
|
233
|
-
|
234
|
-
|
235
|
-
bool same(int i, int j) {
|
236
|
-
return i == j;
|
237
|
-
}
|
238
|
-
|
239
|
-
bool same(int64 i, int64 j) {
|
240
|
-
return i == j;
|
241
|
-
}
|
242
|
-
|
243
|
-
bool same(char i, char j) {
|
244
|
-
return i == j;
|
138
|
+
is.seekg(pos);
|
139
|
+
}
|
140
|
+
oss << c;
|
245
141
|
}
|
246
|
-
|
247
|
-
|
248
|
-
|
142
|
+
throw ParseException('"');
|
143
|
+
}
|
144
|
+
|
145
|
+
void read(std::istream &is, bool &b) {
|
146
|
+
_spaces(is);
|
147
|
+
std::ostringstream oss;
|
148
|
+
while (is.good()) {
|
149
|
+
int i = is.peek();
|
150
|
+
if (!isalpha(i)) {
|
151
|
+
break;
|
152
|
+
}
|
153
|
+
oss.put(i);
|
154
|
+
is.ignore(1);
|
155
|
+
}
|
156
|
+
std::string s = oss.str();
|
157
|
+
std::transform(s.begin(), s.end(), s.begin(), ::tolower);
|
158
|
+
if (s == "true") {
|
159
|
+
b = true;
|
160
|
+
} else if (s == "false") {
|
161
|
+
b = false;
|
162
|
+
} else {
|
163
|
+
throw ParseException("Expect a boolean value (true or false)", _rest(is));
|
249
164
|
}
|
250
|
-
|
251
|
-
|
252
|
-
|
253
|
-
|
254
|
-
|
165
|
+
}
|
166
|
+
|
167
|
+
template <typename T>
|
168
|
+
void read(std::istream &is, std::vector<T> &v) {
|
169
|
+
v.clear();
|
170
|
+
_expect(is, '[');
|
171
|
+
_spaces(is);
|
172
|
+
int i = is.peek();
|
173
|
+
if (i == ']') {
|
174
|
+
is.ignore(1);
|
175
|
+
return;
|
255
176
|
}
|
256
|
-
|
257
|
-
|
258
|
-
|
259
|
-
|
260
|
-
return
|
177
|
+
while (is.good()) {
|
178
|
+
T e; read(is, e); v.push_back(e);
|
179
|
+
_spaces(is); char c; is.get(c);
|
180
|
+
if (c == ']') {
|
181
|
+
return;
|
182
|
+
}
|
183
|
+
if (c != ',') {
|
184
|
+
throw ParseException("Expect ',' or ']'", c, _rest(is));
|
185
|
+
}
|
261
186
|
}
|
262
|
-
|
263
|
-
|
264
|
-
|
265
|
-
|
266
|
-
|
267
|
-
|
268
|
-
|
269
|
-
|
270
|
-
|
271
|
-
|
272
|
-
|
187
|
+
throw ParseException(']');
|
188
|
+
}
|
189
|
+
|
190
|
+
void show(std::ostream &os, int i) {
|
191
|
+
os << i;
|
192
|
+
}
|
193
|
+
|
194
|
+
void show(std::ostream &os, int64 l) {
|
195
|
+
os << l;
|
196
|
+
}
|
197
|
+
|
198
|
+
void show(std::ostream &os, float f) {
|
199
|
+
os.precision(8);
|
200
|
+
os << f;
|
201
|
+
}
|
202
|
+
|
203
|
+
void show(std::ostream &os, double d) {
|
204
|
+
os.precision(16);
|
205
|
+
os << d;
|
206
|
+
}
|
207
|
+
|
208
|
+
void show(std::ostream &os, char c) {
|
209
|
+
os << '\'' << c << '\'';
|
210
|
+
}
|
211
|
+
|
212
|
+
void show(std::ostream &os, std::string const &s) {
|
213
|
+
os << '"' << s << '"';
|
214
|
+
}
|
215
|
+
|
216
|
+
void show(std::ostream &os, bool b) {
|
217
|
+
os << (b ? "true" : "false");
|
218
|
+
}
|
219
|
+
|
220
|
+
template <typename T>
|
221
|
+
void show(std::ostream &os, std::vector<T> const &v) {
|
222
|
+
typedef typename std::vector<T>::const_iterator Iterator;
|
223
|
+
bool first = true;
|
224
|
+
os << '[';
|
225
|
+
for (Iterator it = v.begin(); it != v.end(); ++it) {
|
226
|
+
if (!first) {
|
227
|
+
os << ',';
|
228
|
+
}
|
229
|
+
show(os, *it);
|
230
|
+
first = false;
|
231
|
+
}
|
232
|
+
os << ']';
|
233
|
+
}
|
234
|
+
|
235
|
+
bool same(int i, int j) {
|
236
|
+
return i == j;
|
237
|
+
}
|
238
|
+
|
239
|
+
bool same(int64 i, int64 j) {
|
240
|
+
return i == j;
|
241
|
+
}
|
242
|
+
|
243
|
+
bool same(char i, char j) {
|
244
|
+
return i == j;
|
245
|
+
}
|
246
|
+
|
247
|
+
bool same(std::string const &x, std::string const &y) {
|
248
|
+
return x == y;
|
249
|
+
}
|
250
|
+
|
251
|
+
bool same(float x, float y) {
|
252
|
+
float p = x * (1.0 - 1e-5);
|
253
|
+
float q = x * (1.0 + 1e-5);
|
254
|
+
return y >= std::min(p, q) && y <= std::max(p, q);
|
255
|
+
}
|
256
|
+
|
257
|
+
bool same(double x, double y) {
|
258
|
+
double p = x * (1.0 - 1e-9);
|
259
|
+
double q = x * (1.0 + 1e-9);
|
260
|
+
return y >= std::min(p, q) && y <= std::max(p, q);
|
261
|
+
}
|
262
|
+
|
263
|
+
template <typename T>
|
264
|
+
bool same(std::vector<T> const &v1, std::vector<T> const &v2) {
|
265
|
+
typedef typename std::vector<T>::const_iterator Iterator;
|
266
|
+
Iterator i1 = v1.begin(),
|
267
|
+
i2 = v2.begin();
|
268
|
+
while (true) {
|
269
|
+
if (i1 == v1.end()) return i2 == v2.end();
|
270
|
+
if (i2 == v2.end()) return false;
|
271
|
+
if (!same(*i1++, *i2++)) return false;
|
273
272
|
}
|
273
|
+
}
|
274
274
|
}
|
275
275
|
|
276
276
|
#endif /* GETTC_TOPCODER_H */
|