s_matrix 0.0.1 → 0.0.3
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/.gitignore +6 -0
- data/Gemfile +4 -0
- data/README.md +7 -0
- data/Rakefile +11 -0
- data/ext/s_matrix/Makefile +239 -0
- data/ext/s_matrix/extconf.rb +15 -0
- data/ext/s_matrix/gmatx.cpp +66 -0
- data/ext/s_matrix/gmatx.h +28 -0
- data/ext/s_matrix/matx_content.cpp +82 -0
- data/ext/s_matrix/matx_content.h +32 -0
- data/ext/s_matrix/matx_row.cpp +97 -0
- data/ext/s_matrix/matx_row.h +36 -0
- data/ext/s_matrix/matx_string.h +7 -0
- data/ext/s_matrix/matx_title.cpp +30 -0
- data/ext/s_matrix/matx_title.h +28 -0
- data/ext/s_matrix/matx_type_def.h +8 -0
- data/ext/s_matrix/mkmf.log +33 -0
- data/ext/s_matrix/s_matrix.cpp +177 -0
- data/lib/s_matrix/version.rb +5 -0
- data/lib/s_matrix.rb +10 -0
- data/s_matrix.gemspec +32 -0
- data/spec/equipment_strengthen.plist +1440006 -0
- data/spec/performance_spec.rb +48 -0
- data/spec/smatrix_spec.rb +90 -0
- data/spec/spec_helper.rb +10 -0
- data/spec/xml_load.rb +55 -0
- metadata +78 -6
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: e3c71d1514129d41285ca6bcdba7675d8c679a15
|
4
|
+
data.tar.gz: 1d805c4c4711ab18cf4265db484c59bfd7aba042
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: ce62e5637c30997f00aea492b231b2076f0e4880e052204b648a02bf5e1ac241469134c7adf92250cc2a9c55a2931866ca9c220efd55c383452ce456503c3d83
|
7
|
+
data.tar.gz: d5dc439be30b0d6ba4284de0c9ae5d1de460361395ecc1083bbae105dcb87e5771fea1fc224465474d1473fef98b464f0b494cbecf78a8e9224a85e188a99414
|
data/.gitignore
CHANGED
data/Gemfile
ADDED
data/README.md
CHANGED
@@ -27,3 +27,10 @@ TODO: Write usage instructions here
|
|
27
27
|
3. Commit your changes (`git commit -am 'Add some feature'`)
|
28
28
|
4. Push to the branch (`git push origin my-new-feature`)
|
29
29
|
5. Create a new Pull Request
|
30
|
+
|
31
|
+
gem build s_matrix.gemspec
|
32
|
+
|
33
|
+
gem install ./s_matrix-0.0.1.gem # please change version number to current one.
|
34
|
+
|
35
|
+
gem push s_matrix-0.0.1.gem
|
36
|
+
|
data/Rakefile
ADDED
@@ -0,0 +1,239 @@
|
|
1
|
+
|
2
|
+
SHELL = /bin/sh
|
3
|
+
|
4
|
+
# V=0 quiet, V=1 verbose. other values don't work.
|
5
|
+
V = 0
|
6
|
+
Q1 = $(V:1=)
|
7
|
+
Q = $(Q1:0=@)
|
8
|
+
ECHO1 = $(V:1=@:)
|
9
|
+
ECHO = $(ECHO1:0=@echo)
|
10
|
+
|
11
|
+
#### Start of system configuration section. ####
|
12
|
+
|
13
|
+
srcdir = .
|
14
|
+
topdir = /Users/zhangyuan/.rvm/rubies/ruby-2.1.0/include/ruby-2.1.0
|
15
|
+
hdrdir = $(topdir)
|
16
|
+
arch_hdrdir = /Users/zhangyuan/.rvm/rubies/ruby-2.1.0/include/ruby-2.1.0/x86_64-darwin13.0
|
17
|
+
PATH_SEPARATOR = :
|
18
|
+
VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby
|
19
|
+
prefix = $(DESTDIR)/Users/zhangyuan/.rvm/rubies/ruby-2.1.0
|
20
|
+
rubysitearchprefix = $(rubylibprefix)/$(sitearch)
|
21
|
+
rubyarchprefix = $(rubylibprefix)/$(arch)
|
22
|
+
rubylibprefix = $(libdir)/$(RUBY_BASE_NAME)
|
23
|
+
exec_prefix = $(prefix)
|
24
|
+
vendorarchhdrdir = $(vendorhdrdir)/$(sitearch)
|
25
|
+
sitearchhdrdir = $(sitehdrdir)/$(sitearch)
|
26
|
+
rubyarchhdrdir = $(rubyhdrdir)/$(arch)
|
27
|
+
vendorhdrdir = $(rubyhdrdir)/vendor_ruby
|
28
|
+
sitehdrdir = $(rubyhdrdir)/site_ruby
|
29
|
+
rubyhdrdir = $(includedir)/$(RUBY_VERSION_NAME)
|
30
|
+
vendorarchdir = $(vendorlibdir)/$(sitearch)
|
31
|
+
vendorlibdir = $(vendordir)/$(ruby_version)
|
32
|
+
vendordir = $(rubylibprefix)/vendor_ruby
|
33
|
+
sitearchdir = $(sitelibdir)/$(sitearch)
|
34
|
+
sitelibdir = $(sitedir)/$(ruby_version)
|
35
|
+
sitedir = $(rubylibprefix)/site_ruby
|
36
|
+
rubyarchdir = $(rubylibdir)/$(arch)
|
37
|
+
rubylibdir = $(rubylibprefix)/$(ruby_version)
|
38
|
+
sitearchincludedir = $(includedir)/$(sitearch)
|
39
|
+
archincludedir = $(includedir)/$(arch)
|
40
|
+
sitearchlibdir = $(libdir)/$(sitearch)
|
41
|
+
archlibdir = $(libdir)/$(arch)
|
42
|
+
ridir = $(datarootdir)/$(RI_BASE_NAME)
|
43
|
+
mandir = $(datarootdir)/man
|
44
|
+
localedir = $(datarootdir)/locale
|
45
|
+
libdir = $(exec_prefix)/lib
|
46
|
+
psdir = $(docdir)
|
47
|
+
pdfdir = $(docdir)
|
48
|
+
dvidir = $(docdir)
|
49
|
+
htmldir = $(docdir)
|
50
|
+
infodir = $(datarootdir)/info
|
51
|
+
docdir = $(datarootdir)/doc/$(PACKAGE)
|
52
|
+
oldincludedir = $(DESTDIR)/usr/include
|
53
|
+
includedir = $(prefix)/include
|
54
|
+
localstatedir = $(prefix)/var
|
55
|
+
sharedstatedir = $(prefix)/com
|
56
|
+
sysconfdir = $(prefix)/etc
|
57
|
+
datadir = $(datarootdir)
|
58
|
+
datarootdir = $(prefix)/share
|
59
|
+
libexecdir = $(exec_prefix)/libexec
|
60
|
+
sbindir = $(exec_prefix)/sbin
|
61
|
+
bindir = $(exec_prefix)/bin
|
62
|
+
archdir = $(rubyarchdir)
|
63
|
+
|
64
|
+
|
65
|
+
CC = gcc
|
66
|
+
CXX = g++
|
67
|
+
LIBRUBY = $(LIBRUBY_SO)
|
68
|
+
LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
|
69
|
+
LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME)
|
70
|
+
LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static -framework CoreFoundation
|
71
|
+
empty =
|
72
|
+
OUTFLAG = -o $(empty)
|
73
|
+
COUTFLAG = -o $(empty)
|
74
|
+
|
75
|
+
RUBY_EXTCONF_H =
|
76
|
+
cflags = $(optflags) $(debugflags) $(warnflags)
|
77
|
+
optflags = -O3 -fno-fast-math
|
78
|
+
debugflags = -ggdb3
|
79
|
+
warnflags = -Wall -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wunused-variable -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration -Wdivision-by-zero -Wextra-tokens
|
80
|
+
CCDLFLAGS = -fno-common
|
81
|
+
CFLAGS = $(CCDLFLAGS) $(cflags) -fno-common -pipe -Wall $(ARCH_FLAG)
|
82
|
+
INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir)
|
83
|
+
DEFS =
|
84
|
+
CPPFLAGS = -I/usr/local/opt/libyaml/include -I/usr/local/opt/readline/include -I/usr/local/opt/libksba/include -I/usr/local/opt/openssl/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE -D_DARWIN_UNLIMITED_SELECT -D_REENTRANT $(DEFS) $(cppflags)
|
85
|
+
CXXFLAGS = $(CCDLFLAGS) $(cxxflags) $(ARCH_FLAG)
|
86
|
+
ldflags = -L. -fstack-protector -L/usr/local/lib
|
87
|
+
dldflags = -Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress
|
88
|
+
ARCH_FLAG =
|
89
|
+
DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG)
|
90
|
+
LDSHARED = $(CC) -dynamic -bundle
|
91
|
+
LDSHAREDXX = $(CXX) -dynamic -bundle
|
92
|
+
AR = ar
|
93
|
+
EXEEXT =
|
94
|
+
|
95
|
+
RUBY_INSTALL_NAME = ruby
|
96
|
+
RUBY_SO_NAME = ruby.2.1.0
|
97
|
+
RUBYW_INSTALL_NAME =
|
98
|
+
RUBY_VERSION_NAME = $(RUBY_BASE_NAME)-$(ruby_version)
|
99
|
+
RUBYW_BASE_NAME = rubyw
|
100
|
+
RUBY_BASE_NAME = ruby
|
101
|
+
|
102
|
+
arch = x86_64-darwin13.0
|
103
|
+
sitearch = $(arch)
|
104
|
+
ruby_version = 2.1.0
|
105
|
+
ruby = $(bindir)/ruby
|
106
|
+
RUBY = $(ruby)
|
107
|
+
ruby_headers = $(hdrdir)/ruby.h $(hdrdir)/ruby/ruby.h $(hdrdir)/ruby/defines.h $(hdrdir)/ruby/missing.h $(hdrdir)/ruby/intern.h $(hdrdir)/ruby/st.h $(hdrdir)/ruby/subst.h $(arch_hdrdir)/ruby/config.h
|
108
|
+
|
109
|
+
RM = rm -f
|
110
|
+
RM_RF = $(RUBY) -run -e rm -- -rf
|
111
|
+
RMDIRS = rmdir -p
|
112
|
+
MAKEDIRS = mkdir -p
|
113
|
+
INSTALL = /usr/bin/install -c
|
114
|
+
INSTALL_PROG = $(INSTALL) -m 0755
|
115
|
+
INSTALL_DATA = $(INSTALL) -m 644
|
116
|
+
COPY = cp
|
117
|
+
TOUCH = exit >
|
118
|
+
|
119
|
+
#### End of system configuration section. ####
|
120
|
+
|
121
|
+
preload =
|
122
|
+
|
123
|
+
libpath = . $(libdir) /usr/local/opt/libyaml/lib /usr/local/opt/readline/lib /usr/local/opt/libksba/lib /usr/local/opt/openssl/lib
|
124
|
+
LIBPATH = -L. -L$(libdir) -L/usr/local/opt/libyaml/lib -L/usr/local/opt/readline/lib -L/usr/local/opt/libksba/lib -L/usr/local/opt/openssl/lib
|
125
|
+
DEFFILE =
|
126
|
+
|
127
|
+
CLEANFILES = mkmf.log
|
128
|
+
DISTCLEANFILES =
|
129
|
+
DISTCLEANDIRS =
|
130
|
+
|
131
|
+
extout =
|
132
|
+
extout_prefix =
|
133
|
+
target_prefix = /s_matrix
|
134
|
+
LOCAL_LIBS =
|
135
|
+
LIBS = $(LIBRUBYARG_SHARED) -lstdc++ -lpthread -ldl -lobjc
|
136
|
+
ORIG_SRCS = gmatx.cpp s_matrix.cpp
|
137
|
+
SRCS = $(ORIG_SRCS)
|
138
|
+
OBJS = gmatx.o s_matrix.o
|
139
|
+
HDRS = $(srcdir)/gmatx.h
|
140
|
+
TARGET = s_matrix
|
141
|
+
TARGET_NAME = s_matrix
|
142
|
+
TARGET_ENTRY = Init_$(TARGET_NAME)
|
143
|
+
DLLIB = $(TARGET).bundle
|
144
|
+
EXTSTATIC =
|
145
|
+
STATIC_LIB =
|
146
|
+
|
147
|
+
TIMESTAMP_DIR = .
|
148
|
+
BINDIR = $(bindir)
|
149
|
+
RUBYCOMMONDIR = $(sitedir)$(target_prefix)
|
150
|
+
RUBYLIBDIR = $(sitelibdir)$(target_prefix)
|
151
|
+
RUBYARCHDIR = $(sitearchdir)$(target_prefix)
|
152
|
+
HDRDIR = $(rubyhdrdir)/ruby$(target_prefix)
|
153
|
+
ARCHHDRDIR = $(rubyhdrdir)/$(arch)/ruby$(target_prefix)
|
154
|
+
|
155
|
+
TARGET_SO = $(DLLIB)
|
156
|
+
CLEANLIBS = $(TARGET).bundle
|
157
|
+
CLEANOBJS = *.o *.bak
|
158
|
+
|
159
|
+
all: $(DLLIB)
|
160
|
+
static: $(STATIC_LIB)
|
161
|
+
.PHONY: all install static install-so install-rb
|
162
|
+
.PHONY: clean clean-so clean-static clean-rb
|
163
|
+
|
164
|
+
clean-static::
|
165
|
+
clean-rb-default::
|
166
|
+
clean-rb::
|
167
|
+
clean-so::
|
168
|
+
clean: clean-so clean-static clean-rb-default clean-rb
|
169
|
+
-$(Q)$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES) .*.time
|
170
|
+
|
171
|
+
distclean-rb-default::
|
172
|
+
distclean-rb::
|
173
|
+
distclean-so::
|
174
|
+
distclean-static::
|
175
|
+
distclean: clean distclean-so distclean-static distclean-rb-default distclean-rb
|
176
|
+
-$(Q)$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log
|
177
|
+
-$(Q)$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)
|
178
|
+
-$(Q)$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true
|
179
|
+
|
180
|
+
realclean: distclean
|
181
|
+
install: install-so install-rb
|
182
|
+
|
183
|
+
install-so: $(DLLIB) $(TIMESTAMP_DIR)/.RUBYARCHDIR.-.s_matrix.time
|
184
|
+
$(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
|
185
|
+
clean-static::
|
186
|
+
-$(Q)$(RM) $(STATIC_LIB)
|
187
|
+
install-rb: pre-install-rb install-rb-default
|
188
|
+
install-rb-default: pre-install-rb-default
|
189
|
+
pre-install-rb: Makefile
|
190
|
+
pre-install-rb-default: Makefile
|
191
|
+
pre-install-rb-default:
|
192
|
+
$(ECHO) installing default s_matrix libraries
|
193
|
+
$(TIMESTAMP_DIR)/.RUBYARCHDIR.-.s_matrix.time:
|
194
|
+
$(Q) $(MAKEDIRS) $(@D) $(RUBYARCHDIR)
|
195
|
+
$(Q) $(TOUCH) $@
|
196
|
+
|
197
|
+
site-install: site-install-so site-install-rb
|
198
|
+
site-install-so: install-so
|
199
|
+
site-install-rb: install-rb
|
200
|
+
|
201
|
+
.SUFFIXES: .c .m .cc .mm .cxx .cpp .C .o
|
202
|
+
|
203
|
+
.cc.o:
|
204
|
+
$(ECHO) compiling $(<)
|
205
|
+
$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
|
206
|
+
|
207
|
+
.mm.o:
|
208
|
+
$(ECHO) compiling $(<)
|
209
|
+
$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
|
210
|
+
|
211
|
+
.cxx.o:
|
212
|
+
$(ECHO) compiling $(<)
|
213
|
+
$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
|
214
|
+
|
215
|
+
.cpp.o:
|
216
|
+
$(ECHO) compiling $(<)
|
217
|
+
$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
|
218
|
+
|
219
|
+
.C.o:
|
220
|
+
$(ECHO) compiling $(<)
|
221
|
+
$(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
|
222
|
+
|
223
|
+
.c.o:
|
224
|
+
$(ECHO) compiling $(<)
|
225
|
+
$(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $<
|
226
|
+
|
227
|
+
.m.o:
|
228
|
+
$(ECHO) compiling $(<)
|
229
|
+
$(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $<
|
230
|
+
|
231
|
+
$(DLLIB): $(OBJS) Makefile
|
232
|
+
$(ECHO) linking shared-object s_matrix/$(DLLIB)
|
233
|
+
-$(Q)$(RM) $(@)
|
234
|
+
$(Q) $(LDSHAREDXX) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS)
|
235
|
+
$(Q) $(POSTLINK)
|
236
|
+
|
237
|
+
|
238
|
+
|
239
|
+
$(OBJS): $(HDRS) $(ruby_headers)
|
@@ -0,0 +1,15 @@
|
|
1
|
+
#---
|
2
|
+
# Excerpted from "Programming Ruby 1.9",
|
3
|
+
# published by The Pragmatic Bookshelf.
|
4
|
+
# Copyrights apply to this code. It may not be used to create training material,
|
5
|
+
# courses, books, articles, and the like. Contact us if you are in doubt.
|
6
|
+
# We make no guarantees that this code is fit for any purpose.
|
7
|
+
# Visit http://www.pragmaticprogrammer.com/titles/ruby3 for more book information.
|
8
|
+
#---
|
9
|
+
require 'mkmf'
|
10
|
+
|
11
|
+
have_library( 'stdc++' );
|
12
|
+
$CFLAGS << " -Wall"
|
13
|
+
|
14
|
+
|
15
|
+
create_makefile("s_matrix/s_matrix")
|
@@ -0,0 +1,66 @@
|
|
1
|
+
#include <assert.h>
|
2
|
+
#include <sstream>
|
3
|
+
|
4
|
+
#include "gmatx.h"
|
5
|
+
#include "stdio.h"
|
6
|
+
|
7
|
+
|
8
|
+
GMatx::GMatx(void)
|
9
|
+
{
|
10
|
+
}
|
11
|
+
|
12
|
+
void GMatx::add_row(const std::string& id, const t_key_value_hash& row_content)
|
13
|
+
{
|
14
|
+
// 处理新增的title
|
15
|
+
//
|
16
|
+
for (t_key_value_hash::const_iterator iter = row_content.begin();
|
17
|
+
iter != row_content.end(); ++iter)
|
18
|
+
{
|
19
|
+
const std::string& title = iter->first;
|
20
|
+
if (m_titles.is_title_exist(title) == false)
|
21
|
+
m_titles.add_title(title);
|
22
|
+
}
|
23
|
+
|
24
|
+
// 加到content中
|
25
|
+
//
|
26
|
+
m_contents.set_row_with_order(id, row_content, m_titles.get_titles());
|
27
|
+
}
|
28
|
+
|
29
|
+
t_key_value_hash GMatx::get_row(const std::string& id) const
|
30
|
+
{
|
31
|
+
t_key_value_hash result;
|
32
|
+
const std::vector<std::string>& titles = m_titles.get_titles();
|
33
|
+
const MatxRow& row = m_contents.get_row(id);
|
34
|
+
if (&row == &MatxRow::null_row)
|
35
|
+
return result;
|
36
|
+
|
37
|
+
return row.to_key_value_hash(titles);
|
38
|
+
}
|
39
|
+
|
40
|
+
// typedef void (*each_call_func)(const std::string& /*key*/, const t_key_value_hash& /*row_content*/);
|
41
|
+
void GMatx::each_call(each_call_func func) const
|
42
|
+
{
|
43
|
+
const std::vector<std::string>& titles = m_titles.get_titles();
|
44
|
+
for (std::map<std::string /* id */, MatxRow>::const_iterator iter = m_contents.begin();
|
45
|
+
iter != m_contents.end(); ++iter)
|
46
|
+
{
|
47
|
+
const std::string& id = iter->first;
|
48
|
+
const MatxRow& row = iter->second;
|
49
|
+
func(id, row.to_key_value_hash(titles));
|
50
|
+
}
|
51
|
+
}
|
52
|
+
|
53
|
+
std::string GMatx::to_s(void) const
|
54
|
+
{
|
55
|
+
std::ostringstream ret;
|
56
|
+
ret << "GMatx: " << m_contents.size() << '\n';
|
57
|
+
|
58
|
+
const std::vector<std::string>& titles = m_titles.get_titles();
|
59
|
+
ret << m_contents.to_s(titles);
|
60
|
+
return ret.str();
|
61
|
+
}
|
62
|
+
|
63
|
+
size_t GMatx::size(void) const
|
64
|
+
{
|
65
|
+
return m_contents.size();
|
66
|
+
}
|
@@ -0,0 +1,28 @@
|
|
1
|
+
#ifndef _GMATX_H_
|
2
|
+
#define _GMATX_H_
|
3
|
+
|
4
|
+
#include "matx_title.h"
|
5
|
+
#include "matx_content.h"
|
6
|
+
#include "matx_type_def.h"
|
7
|
+
|
8
|
+
class GMatx
|
9
|
+
{
|
10
|
+
public:
|
11
|
+
GMatx(void);
|
12
|
+
|
13
|
+
void add_row(const std::string& id, const t_key_value_hash& row_content);
|
14
|
+
|
15
|
+
// 当找不到id所对应的行时,返回的t_key_value_hash数据的size=0
|
16
|
+
t_key_value_hash get_row(const std::string& id) const;
|
17
|
+
std::string to_s(void) const;
|
18
|
+
size_t size(void) const;
|
19
|
+
|
20
|
+
typedef void (*each_call_func)(const std::string& /*key*/, const t_key_value_hash& /*row_content*/);
|
21
|
+
void each_call(each_call_func func) const;
|
22
|
+
|
23
|
+
private:
|
24
|
+
MatxTitle m_titles;
|
25
|
+
MatxContent m_contents;
|
26
|
+
};
|
27
|
+
|
28
|
+
#endif
|
@@ -0,0 +1,82 @@
|
|
1
|
+
#include <sstream>
|
2
|
+
|
3
|
+
#include "matx_content.h"
|
4
|
+
#include "stdio.h"
|
5
|
+
|
6
|
+
|
7
|
+
MatxContent::MatxContent(void)
|
8
|
+
{
|
9
|
+
}
|
10
|
+
|
11
|
+
const MatxRow& MatxContent::get_row(const std::string& id) const
|
12
|
+
{
|
13
|
+
std::map<std::string, MatxRow>::const_iterator iter = m_rows.find(id);
|
14
|
+
if (iter == m_rows.end())
|
15
|
+
return MatxRow::null_row;
|
16
|
+
|
17
|
+
return iter->second;
|
18
|
+
}
|
19
|
+
|
20
|
+
const std::map<std::string /* id */, MatxRow>::const_iterator MatxContent::begin(void) const
|
21
|
+
{
|
22
|
+
return m_rows.begin();
|
23
|
+
}
|
24
|
+
|
25
|
+
const std::map<std::string /* id */, MatxRow>::const_iterator MatxContent::end(void) const
|
26
|
+
{
|
27
|
+
return m_rows.end();
|
28
|
+
}
|
29
|
+
|
30
|
+
size_t MatxContent::size(void) const
|
31
|
+
{
|
32
|
+
return m_rows.size();
|
33
|
+
}
|
34
|
+
|
35
|
+
void MatxContent::set_row(const std::string& id, const MatxRow& row)
|
36
|
+
{
|
37
|
+
m_rows[id] = row;
|
38
|
+
}
|
39
|
+
|
40
|
+
std::string MatxContent::to_s(const std::vector<std::string>& titles) const
|
41
|
+
{
|
42
|
+
std::ostringstream ret;
|
43
|
+
std::map<std::string, MatxRow>::const_iterator iter;
|
44
|
+
for (iter = m_rows.begin(); iter != m_rows.end(); ++iter)
|
45
|
+
{
|
46
|
+
const std::string& id = iter->first;
|
47
|
+
const MatxRow& row = iter->second;
|
48
|
+
|
49
|
+
ret << " \"" << id << "\"\n";
|
50
|
+
|
51
|
+
const std::vector<std::string>& values = row.get_values();
|
52
|
+
for (size_t i = 0; i < values.size(); ++i)
|
53
|
+
{
|
54
|
+
const std::string& value = values[i];
|
55
|
+
std::string value_show = (value == MatxRow::null_string ? "nil" : value);
|
56
|
+
ret << " -- \"" << titles[i] << "\" \"" << value_show << "\"\n";
|
57
|
+
}
|
58
|
+
|
59
|
+
}
|
60
|
+
return ret.str();
|
61
|
+
}
|
62
|
+
|
63
|
+
void MatxContent::set_row_with_order(const std::string& id, const t_key_value_hash& row_content, const std::vector<std::string>& titles_for_order)
|
64
|
+
{
|
65
|
+
// 根据titles_for_order的顺序,组装出value
|
66
|
+
std::vector<std::string> values;
|
67
|
+
for (std::vector<std::string>::const_iterator iter = titles_for_order.begin();
|
68
|
+
iter != titles_for_order.end(); ++iter)
|
69
|
+
{
|
70
|
+
const std::string& title = *iter;
|
71
|
+
t_key_value_hash::const_iterator content_iter = row_content.find(title);
|
72
|
+
if (content_iter == row_content.end())
|
73
|
+
{
|
74
|
+
values.push_back(MatxRow::null_string); // 没有的项目,使用nil字符串来保存
|
75
|
+
}
|
76
|
+
else
|
77
|
+
values.push_back(content_iter->second);
|
78
|
+
}
|
79
|
+
|
80
|
+
// 保存行
|
81
|
+
m_rows[id] = MatxRow(values);
|
82
|
+
}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
#ifndef _MATX_CONTENT_H_
|
2
|
+
#define _MATX_CONTENT_H_
|
3
|
+
|
4
|
+
#include <string>
|
5
|
+
#include <map>
|
6
|
+
#include "matx_row.h"
|
7
|
+
#include "matx_type_def.h"
|
8
|
+
|
9
|
+
class MatxContent
|
10
|
+
{
|
11
|
+
public:
|
12
|
+
MatxContent(void);
|
13
|
+
|
14
|
+
// 按照titles_for_order中的顺序,格式化row_content中的内容,来设置新行
|
15
|
+
void set_row_with_order(const std::string& id, const t_key_value_hash& row_content, const std::vector<std::string>& titles_for_order);
|
16
|
+
|
17
|
+
const MatxRow& get_row(const std::string& id) const;
|
18
|
+
void set_row(const std::string& id, const MatxRow& row);
|
19
|
+
|
20
|
+
const std::map<std::string /* id */, MatxRow>::const_iterator begin(void) const;
|
21
|
+
const std::map<std::string /* id */, MatxRow>::const_iterator end(void) const;
|
22
|
+
|
23
|
+
std::string to_s(const std::vector<std::string>& titles) const;
|
24
|
+
size_t size(void) const;
|
25
|
+
|
26
|
+
private:
|
27
|
+
std::map<std::string /* id */, MatxRow> m_rows; // each row of this matrix
|
28
|
+
};
|
29
|
+
|
30
|
+
|
31
|
+
|
32
|
+
#endif // _MATX_CONTENT_H_
|
@@ -0,0 +1,97 @@
|
|
1
|
+
#include <assert.h>
|
2
|
+
#include "matx_row.h"
|
3
|
+
#include "stdio.h"
|
4
|
+
|
5
|
+
MatxRow MatxRow::null_row = MatxRow();
|
6
|
+
std::string MatxRow::null_string(")(=+matx_null#!^&");
|
7
|
+
static std::string empty_string;
|
8
|
+
|
9
|
+
MatxRow::MatxRow(void)
|
10
|
+
{
|
11
|
+
}
|
12
|
+
|
13
|
+
MatxRow::MatxRow(const MatxRow& r)
|
14
|
+
{
|
15
|
+
*this = r;
|
16
|
+
}
|
17
|
+
|
18
|
+
MatxRow& MatxRow::operator=(const MatxRow& r)
|
19
|
+
{
|
20
|
+
if (&r == this)
|
21
|
+
return *this;
|
22
|
+
set_values(r.get_values());
|
23
|
+
return *this;
|
24
|
+
}
|
25
|
+
|
26
|
+
MatxRow::MatxRow(const std::vector<std::string>& values)
|
27
|
+
{
|
28
|
+
set_values(values);
|
29
|
+
}
|
30
|
+
|
31
|
+
MatxRow::~MatxRow()
|
32
|
+
{
|
33
|
+
reset_container();
|
34
|
+
}
|
35
|
+
|
36
|
+
void MatxRow::reset_container(void)
|
37
|
+
{
|
38
|
+
for (size_t i = 0; i < m_values.size(); ++i)
|
39
|
+
{
|
40
|
+
std::string* pStr = m_values[i];
|
41
|
+
if (pStr != &null_string && pStr != &empty_string)
|
42
|
+
delete pStr;
|
43
|
+
}
|
44
|
+
m_values.clear();
|
45
|
+
}
|
46
|
+
|
47
|
+
void MatxRow::set_values(const std::vector<std::string>& values)
|
48
|
+
{
|
49
|
+
reset_container();
|
50
|
+
for (size_t i = 0; i < values.size(); ++i)
|
51
|
+
{
|
52
|
+
const std::string& value = values[i];
|
53
|
+
if (value.size() == 0)
|
54
|
+
m_values.push_back(&empty_string);
|
55
|
+
else if (value == MatxRow::null_string)
|
56
|
+
m_values.push_back(&null_string);
|
57
|
+
else
|
58
|
+
{
|
59
|
+
std::string* pValue = new std::string(value);
|
60
|
+
m_values.push_back(pValue);
|
61
|
+
}
|
62
|
+
}
|
63
|
+
}
|
64
|
+
|
65
|
+
std::vector<std::string> MatxRow::get_values(void) const
|
66
|
+
{
|
67
|
+
std::vector<std::string> values;
|
68
|
+
for (size_t i = 0; i < m_values.size(); ++i)
|
69
|
+
values.push_back(*m_values[i]);
|
70
|
+
return values;
|
71
|
+
}
|
72
|
+
|
73
|
+
const std::string& MatxRow::operator[](size_t index) const
|
74
|
+
{
|
75
|
+
if (index >= m_values.size())
|
76
|
+
return null_string;
|
77
|
+
return *m_values[index];
|
78
|
+
}
|
79
|
+
|
80
|
+
t_key_value_hash MatxRow::to_key_value_hash(const std::vector<std::string>& titles) const
|
81
|
+
{
|
82
|
+
t_key_value_hash result;
|
83
|
+
const std::vector<std::string>& values = get_values();
|
84
|
+
assert(titles.size() >= values.size());
|
85
|
+
|
86
|
+
for (size_t i = 0; i < titles.size(); ++i)
|
87
|
+
{
|
88
|
+
const std::string& title = titles[i];
|
89
|
+
if (i < values.size())
|
90
|
+
result[title] = values[i];
|
91
|
+
else
|
92
|
+
result[title] = MatxRow::null_string;
|
93
|
+
}
|
94
|
+
return result;
|
95
|
+
}
|
96
|
+
|
97
|
+
|
@@ -0,0 +1,36 @@
|
|
1
|
+
#ifndef _MATX_ROW_H_
|
2
|
+
#define _MATX_ROW_H_
|
3
|
+
|
4
|
+
#include <string>
|
5
|
+
#include <vector>
|
6
|
+
#include "matx_string.h"
|
7
|
+
#include "matx_type_def.h"
|
8
|
+
|
9
|
+
class MatxRow
|
10
|
+
{
|
11
|
+
public:
|
12
|
+
static MatxRow null_row;
|
13
|
+
static std::string null_string;
|
14
|
+
|
15
|
+
MatxRow(void);
|
16
|
+
MatxRow(const MatxRow& r);
|
17
|
+
MatxRow(const std::vector<std::string>& values);
|
18
|
+
~MatxRow();
|
19
|
+
|
20
|
+
MatxRow& operator=(const MatxRow& r);
|
21
|
+
|
22
|
+
void set_values(const std::vector<std::string>& values);
|
23
|
+
std::vector<std::string> get_values(void) const;
|
24
|
+
const std::string& operator[](size_t index) const;
|
25
|
+
t_key_value_hash to_key_value_hash(const std::vector<std::string>& titles) const;
|
26
|
+
|
27
|
+
private:
|
28
|
+
void reset_container(void);
|
29
|
+
|
30
|
+
private:
|
31
|
+
std::vector<matx_string*> m_values; // values in one row
|
32
|
+
};
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
#endif // _MATX_ROW_H_
|
@@ -0,0 +1,30 @@
|
|
1
|
+
#include "matx_title.h"
|
2
|
+
#include <algorithm>
|
3
|
+
#include <stdio.h>
|
4
|
+
|
5
|
+
|
6
|
+
MatxTitle::MatxTitle(void)
|
7
|
+
{
|
8
|
+
}
|
9
|
+
|
10
|
+
|
11
|
+
void MatxTitle::add_title(const std::string& title)
|
12
|
+
{
|
13
|
+
m_titles.push_back(title);
|
14
|
+
}
|
15
|
+
|
16
|
+
const std::vector<std::string>& MatxTitle::get_titles(void) const
|
17
|
+
{
|
18
|
+
return m_titles;
|
19
|
+
}
|
20
|
+
|
21
|
+
const std::string& MatxTitle::operator[](size_t index) const
|
22
|
+
{
|
23
|
+
return m_titles[index];
|
24
|
+
}
|
25
|
+
|
26
|
+
bool MatxTitle::is_title_exist(const std::string& title) const
|
27
|
+
{
|
28
|
+
std::vector<std::string>::const_iterator iter = find(m_titles.begin(), m_titles.end(), title);
|
29
|
+
return (iter != m_titles.end());
|
30
|
+
}
|