Skip to content

Commit 6687f4a

Browse files
authored
[lsm] outline (#9740)
* initial * tests and fixes * add test target * remove c settings * missing test.sh * include some flycheck dirlocals
1 parent 2773f5b commit 6687f4a

File tree

4 files changed

+195
-0
lines changed

4 files changed

+195
-0
lines changed

.dir-locals.el

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
;;; Directory Local Variables
2+
;;; For more information see (info "(emacs) Directory Variables")
3+
4+
((nil . ((flycheck-pylintrc . "pylintrc")))
5+
(nil . ((flycheck-gcc-language-standard . "c++2a")))
6+
(nil . ((flycheck-clang-language-standard . "c++2a"))))

lsm/Makefile

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
MAKEFLAGS += --no-builtin-rules
2+
.SUFFIXES:
3+
.DEFAULT_GOAL := build/main
4+
5+
CXXFLAGS += -std=c++2a -fPIC -ggdb -g -fno-strict-aliasing
6+
CXXFLAGS += -fno-omit-frame-pointer # enables libasan to provide complete stack traces
7+
CXXFLAGS += -Wall -Werror -Wextra -Wpedantic -Wno-unused-parameter
8+
CXXFLAGS += -Og -fsanitize=address -fsanitize=undefined
9+
10+
CPP_FILES := $(shell find . -iname '*.cpp' -print)
11+
OBJECTS := $(CPP_FILES:%.cpp=build/%.o)
12+
13+
ifneq ($(MAKECMDGOALS),clean)
14+
-include $(OBJECTS:%.o=%.d)
15+
-include $(PROFILE_OBJECTS:%.o=%.d)
16+
-include $(SMALL_OBJECTS:%.o=%.d)
17+
endif
18+
19+
.PHONY: ctags
20+
ctags:
21+
rm -rf TAGS
22+
ctags -e -R .
23+
24+
build/%.d: %.cpp
25+
@mkdir -p $(@D)
26+
$(CXX) $(CXXFLAGS) $< -MG -M -MF $@ -MT $(@:%.d=%.o)
27+
28+
build/%.o: %.cpp
29+
@mkdir -p $(@D)
30+
$(CXX) $(CXXFLAGS) -MD -MF $(@:%.o=%.d) -MT $@ -c $< -o $@
31+
32+
build/%: build/%.o
33+
$(CXX) $(CXXFLAGS) $(LDFLAGS) \
34+
-ldl \
35+
-o $@ \
36+
$(filter %.o,$^)
37+
38+
.PHONY: clean
39+
clean:
40+
rm -rf build
41+
42+
.PHONY: test
43+
test:
44+
./test.sh

lsm/main.cpp

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
#include <iostream>
2+
#include <optional>
3+
#include <map>
4+
#include <string>
5+
#include <variant>
6+
#include <vector>
7+
8+
class LSM {
9+
std::map<int32_t, int32_t> m;
10+
public:
11+
void put(int32_t k, int32_t v) {
12+
// ???
13+
}
14+
std::optional<int32_t> get(int32_t k) {
15+
// ???
16+
}
17+
std::vector<std::pair<int32_t, int32_t>> range(int32_t l, int32_t r) {
18+
// ???
19+
}
20+
void del(int32_t k) {
21+
// ???
22+
}
23+
};
24+
25+
int main(int argc, const char ** argv) {
26+
if (argc != 1) {
27+
std::cerr << "USAGE: main" << std::endl;
28+
return 1;
29+
}
30+
31+
LSM lsm;
32+
33+
auto& in = std::cin;
34+
for (std::string line; std::getline(in, line);) {
35+
switch (line[0]) {
36+
case 'p': {
37+
size_t next;
38+
int k = std::stoi(line.substr(2), &next);
39+
int v = std::stoi(line.substr(2 + next + 1));
40+
lsm.put(k, v);
41+
break;
42+
}
43+
case 'g': {
44+
int k = std::stoi(line.substr(2));
45+
auto x = lsm.get(k);
46+
if (x) {
47+
std::cout << x.value();
48+
}
49+
std::cout << "\n";
50+
break;
51+
}
52+
case 'r': {
53+
size_t next;
54+
int l = std::stoi(line.substr(2), &next);
55+
int r = std::stoi(line.substr(2 + next + 1));
56+
auto x = lsm.range(l, r);
57+
auto begin = x.cbegin();
58+
auto end = x.cend();
59+
if (begin != end) {
60+
std::cout << begin->first << ":" << begin->second;
61+
++begin;
62+
for (; begin != end; ++begin) {
63+
std::cout << " " << begin->first << ":" << begin->second;
64+
}
65+
}
66+
std::cout << "\n";
67+
break;
68+
}
69+
case 'd': {
70+
int k = std::stoi(line.substr(2));
71+
lsm.del(k);
72+
break;
73+
}
74+
default:
75+
std::cout << "unrecognized command " << line << std::endl;
76+
exit(4);
77+
}
78+
}
79+
}

lsm/test.sh

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
#!/bin/bash
2+
set -e
3+
4+
echo 1
5+
build/main > build/out 2> build/err <<EOF
6+
p 10 7
7+
p 63 222
8+
p 10 5
9+
EOF
10+
rm -rf build/expected; touch build/expected
11+
diff build/out build/expected
12+
echo success
13+
14+
echo 2
15+
build/main > build/out 2> build/err <<EOF
16+
p 10 7
17+
p 63 222
18+
g 10
19+
g 15
20+
p 15 5
21+
g 15
22+
EOF
23+
cat > build/expected <<EOF
24+
7
25+
26+
5
27+
EOF
28+
diff build/out build/expected
29+
echo success
30+
31+
echo 3
32+
build/main > build/out 2> build/err <<EOF
33+
p 10 7
34+
p 13 2
35+
p 17 99
36+
p 12 22
37+
r 10 12
38+
r 10 15
39+
r 14 17
40+
r 0 100
41+
EOF
42+
cat > build/expected <<EOF
43+
10:7
44+
10:7 12:22 13:2
45+
46+
10:7 12:22 13:2 17:99
47+
EOF
48+
diff build/out build/expected
49+
echo success
50+
51+
echo 4
52+
build/main > build/out 2> build/err <<EOF
53+
p 10 7
54+
p 12 5
55+
g 10
56+
d 10
57+
g 10
58+
g 12
59+
EOF
60+
cat > build/expected <<EOF
61+
7
62+
63+
5
64+
EOF
65+
diff build/out build/expected
66+
echo success

0 commit comments

Comments
 (0)