test out profiling
@@ -26,7 +26,7 @@
|
|||||||
|
|
||||||
(font-lock-add-keywords
|
(font-lock-add-keywords
|
||||||
'c++-mode
|
'c++-mode
|
||||||
'(("\\<\\(if_debug\\|if_windows\\|if_linux\\|defer\\|proc\\|try\\|try_void\\|without_logging\\)\\>" .
|
'(("\\<\\(if_debug\\|if_windows\\|if_linux\\|defer\\|proc\\|try\\|try_void\\|ignore_logging\\|dont_break_on_errors\\)\\>" .
|
||||||
font-lock-keyword-face)))))))
|
font-lock-keyword-face)))))))
|
||||||
|
|
||||||
(c++-mode . ((eval . (company-clang-set-prefix "slime.h"))
|
(c++-mode . ((eval . (company-clang-set-prefix "slime.h"))
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
[submodule "src/ftb"]
|
||||||
|
path = src/ftb
|
||||||
|
url = https://github.com/FelixBrendel/ftb
|
||||||
@@ -120,7 +120,7 @@ condition is false."
|
|||||||
`(,append-map (lambda (,(first body)) (list ,(rec (rest (rest (rest body)))))) ,(first (rest (rest body)))))
|
`(,append-map (lambda (,(first body)) (list ,(rec (rest (rest (rest body)))))) ,(first (rest (rest body)))))
|
||||||
((= (first body) 'if)
|
((= (first body) 'if)
|
||||||
`(when ,(first (rest body)) ,(rec (rest (rest body)))))
|
`(when ,(first (rest body)) ,(rec (rest (rest body)))))
|
||||||
((= (first body) 'yield)
|
((= (first (rest body)) 'yield)
|
||||||
(first (rest body)))
|
(first (rest body)))
|
||||||
(else (error "Not a do-able expression"))))
|
(else (error "Not a do-able expression"))))
|
||||||
|
|
||||||
@@ -158,19 +158,6 @@ ithe sequence as arguemens."
|
|||||||
exports))))
|
exports))))
|
||||||
|
|
||||||
|
|
||||||
;; (define-syntax (define-package name :rest body)
|
|
||||||
;; `(define ,(string->symbol (concat-strings (symbol->string name) "->"))
|
|
||||||
;; ((lambda ()
|
|
||||||
;; @body
|
|
||||||
;; (set-type
|
|
||||||
;; (special-lambda (:rest args)
|
|
||||||
;; (let ((op (first args))
|
|
||||||
;; (args (rest args)))
|
|
||||||
;; (if (callable? (eval op))
|
|
||||||
;; (apply op args)
|
|
||||||
;; (eval op))))
|
|
||||||
;; :package)))))
|
|
||||||
|
|
||||||
(define (null? x)
|
(define (null? x)
|
||||||
"Checks if the argument is =nil=."
|
"Checks if the argument is =nil=."
|
||||||
(= x ()))
|
(= x ()))
|
||||||
|
|||||||
@@ -3,8 +3,7 @@
|
|||||||
(define (make-counter)
|
(define (make-counter)
|
||||||
(let ((var 0))
|
(let ((var 0))
|
||||||
(lambda ()
|
(lambda ()
|
||||||
(mutate var (+ 1 var))
|
(set! var (+ 1 var)))))
|
||||||
var)))
|
|
||||||
|
|
||||||
(define counter1 (make-counter))
|
(define counter1 (make-counter))
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
(define (make-counter) (let ((var 0)) (lambda () (mutate var (+ 1 var)) var)))
|
(define (make-counter) (let ((var 0)) (lambda () (set! var (+ 1 var)))))
|
||||||
|
|
||||||
(define counter1 (make-counter))
|
(define counter1 (make-counter))
|
||||||
|
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ pushd $SCRIPTPATH > /dev/null
|
|||||||
|
|
||||||
# _DEBUG
|
# _DEBUG
|
||||||
# time g++ -fpermissive src/main.cpp -g -o ./bin/slime --std=c++17 || exit 1
|
# time g++ -fpermissive src/main.cpp -g -o ./bin/slime --std=c++17 || exit 1
|
||||||
time clang++ -fpermissive src/main.cpp -g -o ./bin/slime --std=c++17 || exit 1
|
time clang++ -D_DEBUG -D_PROFILING -fpermissive src/main.cpp -g -o ./bin/slime --std=c++17 || exit 1
|
||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
pushd ./bin > /dev/null
|
pushd ./bin > /dev/null
|
||||||
|
|||||||
@@ -0,0 +1,149 @@
|
|||||||
|
nconst,character,start,end
|
||||||
|
nm0221046,Actor2,53000,237000
|
||||||
|
nm0330687,Actor1,53000,237000
|
||||||
|
nm0569501,Narrator,64000,237000
|
||||||
|
nm0932891,Actor3,72000,237000
|
||||||
|
nm3068638,Actor1 - Age 12,81000,237000
|
||||||
|
nm2788212,Actor2 - Age 12,97000,237000
|
||||||
|
nm1631269,Actor4,240000,424000
|
||||||
|
nm0034309,Actor5,258000,424000
|
||||||
|
nm1131557,Actor6,258000,424000
|
||||||
|
nm0330687,Actor1,273000,424000
|
||||||
|
nm0221046,Actor2,305000,424000
|
||||||
|
nm0034309,Actor5,425000,558000
|
||||||
|
nm0329622,Office Worker,427000,558000
|
||||||
|
nm0330687,Actor1,427000,558000
|
||||||
|
nm0932891,Actor3,427000,558000
|
||||||
|
nm0381763,Actor7,433000,558000
|
||||||
|
nm0803331,Usher,433000,558000
|
||||||
|
nm0163988,Actor8,443000,558000
|
||||||
|
nm0221046,Actor2,449000,558000
|
||||||
|
nm0569501,Narrator,472000,558000
|
||||||
|
nm0221046,Actor2,560000,647000
|
||||||
|
nm0034309,Actor5,561000,647000
|
||||||
|
nm0330687,Actor1,564000,647000
|
||||||
|
nm0163988,Actor8,650000,813000
|
||||||
|
nm0735538,Employee #1,650000,813000
|
||||||
|
nm0330687,Actor1,652000,813000
|
||||||
|
nm0006970,Actor9,654000,813000
|
||||||
|
nm0803331,Usher,656000,813000
|
||||||
|
nm0221046,Actor2,660000,813000
|
||||||
|
nm0034309,Actor5,661000,813000
|
||||||
|
nm0932891,Actor3,699000,813000
|
||||||
|
nm0330687,Actor1,815000,1013000
|
||||||
|
nm1131557,Actor6,815000,1013000
|
||||||
|
nm0221046,Actor2,821000,1013000
|
||||||
|
nm1631269,Actor4,865000,1013000
|
||||||
|
nm0034309,Actor5,888000,1013000
|
||||||
|
nm0034309,Actor5,1014000,1119000
|
||||||
|
nm0330687,Actor1,1014000,1119000
|
||||||
|
nm0221046,Actor2,1048000,1119000
|
||||||
|
nm0330687,Actor1,1119000,1348000
|
||||||
|
nm0034309,Actor5,1126000,1348000
|
||||||
|
nm0221046,Actor2,1126000,1348000
|
||||||
|
nm0006970,Actor9,1279000,1348000
|
||||||
|
nm0330687,Actor1,1348000,1469000
|
||||||
|
nm0221046,Actor2,1348000,1469000
|
||||||
|
nm0034309,Actor5,1348000,1469000
|
||||||
|
nm0221046/trivia,nt0447626,1377000,1469000
|
||||||
|
nm0330687,Actor1,1470000,1619000
|
||||||
|
nm0221046,Actor2,1471000,1619000
|
||||||
|
nm1131557,Actor6,1547000,1619000
|
||||||
|
nm0330687,Actor1,1622000,1839000
|
||||||
|
nm0221046,Actor2,1627000,1839000
|
||||||
|
nm2124215,Actor10,1752000,1839000
|
||||||
|
nm0330687,Actor1,1839000,2006000
|
||||||
|
nm0221046,Actor2,1839000,2006000
|
||||||
|
nm0000148,Self,1910000,2006000
|
||||||
|
nm0330687,Actor1,2008000,2066000
|
||||||
|
nm0163988,Actor8,2019000,2066000
|
||||||
|
nm1304328,New Secretary,2019000,2066000
|
||||||
|
nm0034309,Actor5,2025000,2066000
|
||||||
|
nm0221046,Actor2,2052000,2066000
|
||||||
|
nm0034309,Actor5,2068000,2293000
|
||||||
|
nm0221046,Actor2,2068000,2293000
|
||||||
|
nm0330687,Actor1,2074000,2293000
|
||||||
|
nm0221046,Actor2,2295000,2482000
|
||||||
|
nm0330687,Actor1,2295000,2482000
|
||||||
|
nm0569501,Narrator,2315000,2482000
|
||||||
|
nm1131557,Actor6,2433000,2482000
|
||||||
|
nm0034309,Actor5,2437000,2482000
|
||||||
|
nm0330687,Actor1,2483000,2626000
|
||||||
|
nm1631269,Actor4,2483000,2626000
|
||||||
|
nm0330687/trivia,nt0127470,2539000,2626000
|
||||||
|
nm0221046,Actor2,2557000,2626000
|
||||||
|
nm0221046,Actor2,2630000,2853000
|
||||||
|
nm0330687,Actor1,2630000,2853000
|
||||||
|
nm1071303,Douche,2656000,2853000
|
||||||
|
nm3300012,Girl on the Stairs,2835000,2853000
|
||||||
|
nm0330687,Actor1,2853000,2984000
|
||||||
|
nm0221046,Actor2,2861000,2984000
|
||||||
|
nm0221046/trivia,nt0085270,2908000,2984000
|
||||||
|
nm0221046,Actor2,2985000,3072000
|
||||||
|
nm0330687,Actor1,2987000,3072000
|
||||||
|
nm2622767,Actor11,3050000,3072000
|
||||||
|
nm0330687,Actor1,3072000,3143000
|
||||||
|
nm0221046,Actor2,3073000,3143000
|
||||||
|
nm0221046,Actor2,3148000,3278000
|
||||||
|
nm0330687,Actor1,3148000,3278000
|
||||||
|
nm0897096,Actor12,3194000,3278000
|
||||||
|
nm0533467,Actor13,3209000,3278000
|
||||||
|
nm3505105,Actor14,3249000,3278000
|
||||||
|
nm1304328,New Secretary,3279000,3406000
|
||||||
|
nm0330687,Actor1,3282000,3406000
|
||||||
|
nm0163988,Actor8,3289000,3406000
|
||||||
|
nm0330687,Actor1,3410000,3625000
|
||||||
|
nm0034309,Actor5,3413000,3625000
|
||||||
|
nm0932891,Actor3,3414000,3625000
|
||||||
|
nm0735538,Employee #1,3438000,3625000
|
||||||
|
nm0006970,Actor9,3443000,3625000
|
||||||
|
nm0381763,Actor7,3443000,3625000
|
||||||
|
nm0281068,Actor15,3446000,3625000
|
||||||
|
nm0221046,Actor2,3450000,3625000
|
||||||
|
nm0715377,Bus Driver,3483000,3625000
|
||||||
|
nm1036340,Actor16,3488000,3625000
|
||||||
|
nm0330687,Actor1,3629000,3841000
|
||||||
|
nm0034309,Actor5,3642000,3841000
|
||||||
|
nm0221046,Actor2,3677000,3841000
|
||||||
|
nm0006970,Actor9,3827000,3841000
|
||||||
|
nm2306384,Minister,3827000,3841000
|
||||||
|
nm3505110,Actor9's New Husband,3827000,3841000
|
||||||
|
nm0221046,Actor2,3841000,3984000
|
||||||
|
nm0006970,Actor9,3847000,3984000
|
||||||
|
nm3505110,Actor9's New Husband,3847000,3984000
|
||||||
|
nm0330687,Actor1,3851000,3984000
|
||||||
|
nm3505106,Wedding Singer,3892000,3984000
|
||||||
|
nm1131557,Actor6,3984000,4054000
|
||||||
|
nm0034309,Actor5,3999000,4054000
|
||||||
|
nm0163988,Actor8,4009000,4054000
|
||||||
|
nm0330687,Actor1,4045000,4054000
|
||||||
|
nm0330687,Actor1,4054000,4249000
|
||||||
|
nm0569501,Narrator,4066000,4249000
|
||||||
|
nm0221046,Actor2,4089000,4249000
|
||||||
|
nm1656122,Partygoer,4134000,4249000
|
||||||
|
nm1497668,Rooftop Guy #1,4168000,4249000
|
||||||
|
nm3107009,Another Partygoer,4194000,4249000
|
||||||
|
nm0330687,Actor1,4254000,4305000
|
||||||
|
nm0330687,Actor1,4305000,4514000
|
||||||
|
nm0034309,Actor5,4305000,4514000
|
||||||
|
nm0381763,Actor7,4310000,4514000
|
||||||
|
nm0281068,Actor10,4328000,4514000
|
||||||
|
nm0803331,Usher,4328000,4514000
|
||||||
|
nm0163988,Actor8,4334000,4514000
|
||||||
|
nm0329622,Office Worker,4334000,4514000
|
||||||
|
nm0330687/trivia,nt0127468,4362000,4514000
|
||||||
|
nm0330687,Actor1,4516000,4740000
|
||||||
|
nm1631269,Actor4,4520000,4740000
|
||||||
|
nm1631269/trivia,nt0787786,4533000,4740000
|
||||||
|
nm0221046,Actor2,4583000,4740000
|
||||||
|
nm1071303,Douche,4593000,4740000
|
||||||
|
nm0000163,Ben,4620000,4740000
|
||||||
|
nm0001684,Elaine,4620000,4740000
|
||||||
|
nm0330687,Actor1,4743000,4882000
|
||||||
|
nm0330687/trivia,nt0920755,4751000,4882000
|
||||||
|
nm0221046,Actor2,4851000,4882000
|
||||||
|
nm0330687,Actor1,4885000,5228000
|
||||||
|
nm0221046,Actor2,4907000,5228000
|
||||||
|
nm0330687,Actor1,5230000,5426000
|
||||||
|
nm0569501,Narrator,5240000,5426000
|
||||||
|
nm1310368,Girl at interview,5263000,5426000
|
||||||
|
@@ -0,0 +1,27 @@
|
|||||||
|
import plotly.figure_factory as ff
|
||||||
|
|
||||||
|
df = [
|
||||||
|
{"Task": "call depth 4", "Start": 9321, "Finish": 9326},
|
||||||
|
{"Task": "call depth 3", "Start": 9288, "Finish": 9311},
|
||||||
|
{"Task": "call depth 2", "Start": 9126, "Finish": 9141},
|
||||||
|
{"Task": "call depth 1", "Start": 9088, "Finish": 9099},
|
||||||
|
{"Task": "call depth 0", "Start": 9076, "Finish": 9337},
|
||||||
|
{"Task": "call depth 1", "Start": 9109, "Finish": 9179},
|
||||||
|
{"Task": "call depth 1", "Start": 9194, "Finish": 9334},
|
||||||
|
{"Task": "call depth 2", "Start": 9206, "Finish": 9231},
|
||||||
|
{"Task": "call depth 2", "Start": 9237, "Finish": 9269},
|
||||||
|
{"Task": "call depth 2", "Start": 9274, "Finish": 9331},
|
||||||
|
{"Task": "call depth 3", "Start": 9255, "Finish": 9266},
|
||||||
|
{"Task": "call depth 3", "Start": 9279, "Finish": 9284},
|
||||||
|
{"Task": "call depth 4", "Start": 9299, "Finish": 9309},
|
||||||
|
{"Task": "call depth 3", "Start": 9316, "Finish": 9329},
|
||||||
|
]
|
||||||
|
|
||||||
|
fig = ff.create_gantt(df, group_tasks=True, bar_width=0.4, width=1700, height=720)
|
||||||
|
|
||||||
|
fig["data"][0].update(text="apply_arguments_to_function", hoverinfo="text+x+y")
|
||||||
|
fig["data"][1].update(text="apply_arguments_to_function", hoverinfo="text+x+y")
|
||||||
|
fig["data"][2].update(text="apply_arguments_to_function", hoverinfo="text+x+y")
|
||||||
|
|
||||||
|
|
||||||
|
fig.show()
|
||||||
@@ -0,0 +1,89 @@
|
|||||||
|
import pandas as pd
|
||||||
|
import plotly.graph_objs as go
|
||||||
|
|
||||||
|
call_depths = [0]
|
||||||
|
datas = []
|
||||||
|
|
||||||
|
def ensure_big_enough(list, idx, el):
|
||||||
|
l = len(list)
|
||||||
|
if (idx >= l):
|
||||||
|
list.extend([el]*(idx-l+1))
|
||||||
|
|
||||||
|
def incr_call_depth(thread):
|
||||||
|
ensure_big_enough(call_depths, thread, 0)
|
||||||
|
call_depths[thread] += 1
|
||||||
|
|
||||||
|
def append_to_datas(thread, data):
|
||||||
|
ensure_big_enough(datas, thread, [])
|
||||||
|
datas[thread].append(data)
|
||||||
|
|
||||||
|
with open("../bin/profiler.report", "r") as file:
|
||||||
|
for line in file:
|
||||||
|
infos = line.split()
|
||||||
|
thread = int(infos[0])
|
||||||
|
if infos[1] == "->":
|
||||||
|
incr_call_depth(thread)
|
||||||
|
append_to_datas(thread, {
|
||||||
|
"task": f"[T{thread}] - {'{:03d}'.format(call_depths[thread])}",
|
||||||
|
"start": int(infos[5]),
|
||||||
|
"end": None
|
||||||
|
})
|
||||||
|
elif infos[1] == "<-":
|
||||||
|
call_depths[thread] -= 1
|
||||||
|
for set in datas[thread][::-1]:
|
||||||
|
if set["end"] == None:
|
||||||
|
set["end"] = int(infos[2])
|
||||||
|
break
|
||||||
|
else:
|
||||||
|
print("couldn't find task that finished")
|
||||||
|
break
|
||||||
|
|
||||||
|
else:
|
||||||
|
print("neither -> nor <-")
|
||||||
|
|
||||||
|
|
||||||
|
fig = go.Figure(
|
||||||
|
layout = {
|
||||||
|
'barmode': 'stack',
|
||||||
|
"dragmode" : "pan",
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
|
flat_datas= [item for sublist in datas for item in sublist]
|
||||||
|
# i = 1
|
||||||
|
# df = flat_datas[:20]
|
||||||
|
# for call in df:
|
||||||
|
# name = call["task"]
|
||||||
|
# start = call["start"]
|
||||||
|
# end = call["end"]
|
||||||
|
# duration = end,start
|
||||||
|
# fig.add_bar(x=(i,duration),
|
||||||
|
# y=(i,name),
|
||||||
|
# base=(i,start),
|
||||||
|
# orientation='h',
|
||||||
|
# showlegend=False,
|
||||||
|
# name=name,
|
||||||
|
# hovertext=f"yes",
|
||||||
|
# text=""
|
||||||
|
# )
|
||||||
|
# i += 1
|
||||||
|
|
||||||
|
df = pd.DataFrame(flat_datas[:20])
|
||||||
|
df['duration'] = df['end'] - df['start']
|
||||||
|
|
||||||
|
for stackdepth, stackdepth_df in df.groupby('task'):
|
||||||
|
params = {"x": stackdepth_df.duration,
|
||||||
|
"y": stackdepth_df.task,
|
||||||
|
"name": stackdepth,
|
||||||
|
"base": stackdepth_df.start
|
||||||
|
}
|
||||||
|
print(params)
|
||||||
|
fig.add_bar(**params,
|
||||||
|
orientation='h',
|
||||||
|
showlegend=False,
|
||||||
|
hovertext=f"yes",
|
||||||
|
text=""
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
fig.show(config={'scrollZoom': True})
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
#lang racket
|
||||||
|
(require racket/gui mrlib/snip-canvas plot)
|
||||||
|
|
||||||
|
(define ((make-current-value-renderer fn) snip event x y)
|
||||||
|
(define overlays
|
||||||
|
(and x y (eq? (send event get-event-type) 'motion)
|
||||||
|
(list (vrule x #:style 'long-dash)
|
||||||
|
(point-label (vector x (fn x)) #:anchor 'auto))))
|
||||||
|
(send snip set-overlay-renderers overlays))
|
||||||
|
|
||||||
|
(define (make-plot-snip width height)
|
||||||
|
(define snip (plot-snip (function sin)
|
||||||
|
#:x-min 0 #:x-max (* 2 pi) #:y-min -1.5 #:y-max 1.5
|
||||||
|
#:width width #:height height))
|
||||||
|
(send snip set-mouse-event-callback (make-current-value-renderer sin))
|
||||||
|
snip)
|
||||||
|
|
||||||
|
(define toplevel (new frame% [label "Plot"] [width 500] [height 200]))
|
||||||
|
(define canvas (new snip-canvas% [parent toplevel] [make-snip make-plot-snip]))
|
||||||
|
(send toplevel show #t)
|
||||||
|
|
||||||
|
After Width: | Height: | Size: 13 KiB |
@@ -0,0 +1,173 @@
|
|||||||
|
#!/usr/bin/env python3
|
||||||
|
# -*- coding: utf-8-unix -*-
|
||||||
|
|
||||||
|
import datetime
|
||||||
|
import gantt
|
||||||
|
|
||||||
|
# Change font default
|
||||||
|
gantt.define_font_attributes(fill='black',
|
||||||
|
stroke='black',
|
||||||
|
stroke_width=0,
|
||||||
|
font_family="Verdana")
|
||||||
|
|
||||||
|
# Add vacations for everyone
|
||||||
|
gantt.add_vacations(datetime.date(2014, 12, 25))
|
||||||
|
gantt.add_vacations(datetime.date(2015, 1, 1))
|
||||||
|
gantt.add_vacations(datetime.date(2015, 1, 13))
|
||||||
|
|
||||||
|
# Create two resources
|
||||||
|
rANO = gantt.Resource('ANO')
|
||||||
|
rJLS = gantt.Resource('JLS')
|
||||||
|
|
||||||
|
# Add vacations for one lucky resource
|
||||||
|
rANO.add_vacations(
|
||||||
|
dfrom=datetime.date(2014, 12, 29),
|
||||||
|
dto=datetime.date(2015, 1, 4)
|
||||||
|
)
|
||||||
|
rANO.add_vacations(
|
||||||
|
dfrom=datetime.date(2015, 1, 6),
|
||||||
|
dto=datetime.date(2015, 1, 8)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Test if this resource is avalaible for some dates
|
||||||
|
print(rANO.is_available(datetime.date(2015, 1, 5)))
|
||||||
|
print(rANO.is_available(datetime.date(2015, 1, 8)))
|
||||||
|
print(rANO.is_available(datetime.date(2015, 1, 6)))
|
||||||
|
print(rANO.is_available(datetime.date(2015, 1, 2)))
|
||||||
|
print(rANO.is_available(datetime.date(2015, 1, 1)))
|
||||||
|
|
||||||
|
|
||||||
|
# Create some tasks
|
||||||
|
t1 = gantt.Task(name='tache1',
|
||||||
|
start=datetime.date(2014, 12, 25),
|
||||||
|
duration=4,
|
||||||
|
percent_done=44,
|
||||||
|
resources=[rANO],
|
||||||
|
color="#FF8080")
|
||||||
|
t2 = gantt.Task(name='tache2',
|
||||||
|
start=datetime.date(2014, 12, 28),
|
||||||
|
duration=6,
|
||||||
|
resources=[rJLS])
|
||||||
|
t7 = gantt.Task(name='tache7',
|
||||||
|
start=datetime.date(2014, 12, 28),
|
||||||
|
duration=5,
|
||||||
|
percent_done=50)
|
||||||
|
t3 = gantt.Task(name='tache3',
|
||||||
|
start=datetime.date(2014, 12, 25),
|
||||||
|
duration=4,
|
||||||
|
depends_of=[t1, t7, t2],
|
||||||
|
resources=[rJLS])
|
||||||
|
t4 = gantt.Task(name='tache4',
|
||||||
|
start=datetime.date(2015, 1, 1),
|
||||||
|
duration=4,
|
||||||
|
depends_of=t1,
|
||||||
|
resources=[rJLS])
|
||||||
|
t5 = gantt.Task(name='tache5',
|
||||||
|
start=datetime.date(2014, 12, 23),
|
||||||
|
duration=3)
|
||||||
|
t6 = gantt.Task(name='tache6',
|
||||||
|
start=datetime.date(2014, 12, 25),
|
||||||
|
duration=4,
|
||||||
|
depends_of=t7,
|
||||||
|
resources=[rANO])
|
||||||
|
t8 = gantt.Task(name='tache8',
|
||||||
|
start=datetime.date(2014, 12, 25),
|
||||||
|
duration=4,
|
||||||
|
depends_of=t7,
|
||||||
|
resources=[rANO, rJLS])
|
||||||
|
|
||||||
|
|
||||||
|
# Create a project
|
||||||
|
p1 = gantt.Project(name='Projet 1')
|
||||||
|
|
||||||
|
# Add tasks to this project
|
||||||
|
p1.add_task(t1)
|
||||||
|
p1.add_task(t7)
|
||||||
|
p1.add_task(t2)
|
||||||
|
p1.add_task(t3)
|
||||||
|
p1.add_task(t5)
|
||||||
|
p1.add_task(t8)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Create another project
|
||||||
|
p2 = gantt.Project(name='Projet 2', color='#FFFF40')
|
||||||
|
|
||||||
|
# Add tasks to this project
|
||||||
|
p2.add_task(t2)
|
||||||
|
p2.add_task(t4)
|
||||||
|
|
||||||
|
|
||||||
|
# Create another project
|
||||||
|
p = gantt.Project(name='Gantt')
|
||||||
|
# wich contains the first two projects
|
||||||
|
# and a single task
|
||||||
|
p.add_task(p1)
|
||||||
|
p.add_task(p2)
|
||||||
|
p.add_task(t6)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Test cases for milestones
|
||||||
|
# Create another project
|
||||||
|
ptcm = gantt.Project(name='Test case for milestones')
|
||||||
|
|
||||||
|
tcm11 = gantt.Task(name='tcm11',
|
||||||
|
start=datetime.date(2014, 12, 25),
|
||||||
|
duration=4)
|
||||||
|
tcm12 = gantt.Task(name='tcm12',
|
||||||
|
start=datetime.date(2014, 12, 26),
|
||||||
|
duration=5)
|
||||||
|
ms1 = gantt.Milestone(name=' ',
|
||||||
|
depends_of=[tcm11, tcm12])
|
||||||
|
tcm21 = gantt.Task(name='tcm21',
|
||||||
|
start=datetime.date(2014, 12, 30),
|
||||||
|
duration=4,
|
||||||
|
depends_of=[ms1])
|
||||||
|
tcm22 = gantt.Task(name='tcm22',
|
||||||
|
start=datetime.date(2014, 12, 30),
|
||||||
|
duration=6,
|
||||||
|
depends_of=[ms1])
|
||||||
|
ms2 = gantt.Milestone(name='MS2',
|
||||||
|
depends_of=[ms1, tcm21, tcm22])
|
||||||
|
tcm31 = gantt.Task(name='tcm31',
|
||||||
|
start=datetime.date(2014, 12, 30),
|
||||||
|
duration=6,
|
||||||
|
depends_of=[ms2])
|
||||||
|
ms3 = gantt.Milestone(name='MS3', depends_of=[ms1])
|
||||||
|
|
||||||
|
|
||||||
|
ptcm.add_task(tcm11)
|
||||||
|
ptcm.add_task(tcm12)
|
||||||
|
ptcm.add_task(ms1)
|
||||||
|
ptcm.add_task(tcm21)
|
||||||
|
ptcm.add_task(tcm22)
|
||||||
|
ptcm.add_task(ms2)
|
||||||
|
ptcm.add_task(tcm31)
|
||||||
|
ptcm.add_task(ms3)
|
||||||
|
|
||||||
|
|
||||||
|
p.add_task(ptcm)
|
||||||
|
|
||||||
|
##########################$ MAKE DRAW ###############
|
||||||
|
p.make_svg_for_tasks(filename='test_full.svg',
|
||||||
|
today=datetime.date(2014, 12, 31),
|
||||||
|
start=datetime.date(2014, 8, 22),
|
||||||
|
end=datetime.date(2015, 1, 14))
|
||||||
|
p.make_svg_for_tasks(filename='test_full2.svg',
|
||||||
|
today=datetime.date(2014, 12, 31))
|
||||||
|
p.make_svg_for_tasks(filename='test.svg',
|
||||||
|
today=datetime.date(2014, 12, 31),
|
||||||
|
start=datetime.date(2015, 1, 3),
|
||||||
|
end=datetime.date(2015, 1, 6))
|
||||||
|
p1.make_svg_for_tasks(filename='test_p1.svg',
|
||||||
|
today=datetime.date(2014, 12, 31))
|
||||||
|
p2.make_svg_for_tasks(filename='test_p2.svg',
|
||||||
|
today=datetime.date(2014, 12, 31))
|
||||||
|
p.make_svg_for_resources(filename='test_resources.svg',
|
||||||
|
today=datetime.date(2014, 12, 31),
|
||||||
|
resources=[rANO, rJLS])
|
||||||
|
p.make_svg_for_tasks(filename='test_weekly.svg',
|
||||||
|
today=datetime.date(2014, 12, 31),
|
||||||
|
scale=gantt.DRAW_WITH_WEEKLY_SCALE)
|
||||||
|
##########################$ /MAKE DRAW ###############
|
||||||
|
After Width: | Height: | Size: 58 KiB |
|
After Width: | Height: | Size: 28 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 5.5 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 21 KiB |
@@ -2,26 +2,26 @@
|
|||||||
#define proc auto
|
#define proc auto
|
||||||
|
|
||||||
#ifdef _DEBUG
|
#ifdef _DEBUG
|
||||||
constexpr bool is_debug_build = true;
|
# define if_debug if constexpr (true)
|
||||||
#else
|
#else
|
||||||
constexpr bool is_debug_build = false;
|
# define if_debug if constexpr (false)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define if_debug if constexpr (is_debug_build)
|
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
# define if_windows if constexpr (1)
|
|
||||||
# define if_linux if constexpr (0)
|
|
||||||
# define debug_break() if_debug __debugbreak()
|
# define debug_break() if_debug __debugbreak()
|
||||||
|
# define if_windows if constexpr (true)
|
||||||
|
# define if_linux if constexpr (false)
|
||||||
#else
|
#else
|
||||||
# define debug_break() if_debug raise(SIGTRAP)
|
# define debug_break() if_debug raise(SIGTRAP)
|
||||||
# define if_windows if (0)
|
# define if_windows if constexpr (false)
|
||||||
# define if_linux if (1)
|
# define if_linux if constexpr (true)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define concat_( a, b) a##b
|
#define concat_( a, b) a##b
|
||||||
#define label(prefix, lnum) concat_(prefix,lnum)
|
#define label(prefix, lnum) concat_(prefix,lnum)
|
||||||
#define try \
|
|
||||||
|
#define try_or_else_return(val) \
|
||||||
if (1) \
|
if (1) \
|
||||||
goto label(body,__LINE__); \
|
goto label(body,__LINE__); \
|
||||||
else \
|
else \
|
||||||
@@ -31,46 +31,17 @@ constexpr bool is_debug_build = false;
|
|||||||
if (Globals::log_level == Log_Level::Debug) { \
|
if (Globals::log_level == Log_Level::Debug) { \
|
||||||
printf("in %s:%d\n", __FILE__, __LINE__); \
|
printf("in %s:%d\n", __FILE__, __LINE__); \
|
||||||
} \
|
} \
|
||||||
return 0; \
|
return val; \
|
||||||
} \
|
} \
|
||||||
break; \
|
break; \
|
||||||
} \
|
} \
|
||||||
else label(body,__LINE__):
|
else label(body,__LINE__):
|
||||||
|
|
||||||
#define try_void \
|
#define try_void try_or_else_return()
|
||||||
if (1) \
|
#define try try_or_else_return(0)
|
||||||
goto label(body,__LINE__); \
|
|
||||||
else \
|
|
||||||
while (1) \
|
|
||||||
if (1) { \
|
|
||||||
if (Globals::error) { \
|
|
||||||
if (Globals::log_level == Log_Level::Debug) { \
|
|
||||||
printf("in %s:%d\n", __FILE__, __LINE__); \
|
|
||||||
} \
|
|
||||||
return; \
|
|
||||||
} \
|
|
||||||
break; \
|
|
||||||
} \
|
|
||||||
else label(body,__LINE__):
|
|
||||||
|
|
||||||
;
|
|
||||||
#define without_logging \
|
|
||||||
if (0) \
|
|
||||||
label(finished,__LINE__): ; \
|
|
||||||
else \
|
|
||||||
for (Log_Level log_level_before = Globals::log_level;;) \
|
|
||||||
for(Globals::log_level = Log_Level::None;;) \
|
|
||||||
if (1) { \
|
|
||||||
goto label(body,__LINE__); \
|
|
||||||
} \
|
|
||||||
else \
|
|
||||||
while (1) \
|
|
||||||
if (1) { \
|
|
||||||
Globals::log_level = log_level_before; \
|
|
||||||
goto label(finished,__LINE__); \
|
|
||||||
} \
|
|
||||||
else label(body,__LINE__):
|
|
||||||
|
|
||||||
|
#define dont_break_on_errors fluid_let(Globals::breaking_on_errors, false)
|
||||||
|
#define ignore_logging fluid_let(Globals::log_level, Log_Level::None)
|
||||||
|
|
||||||
|
|
||||||
#define define_array_list(type, name) \
|
#define define_array_list(type, name) \
|
||||||
@@ -170,39 +141,8 @@ constexpr bool is_debug_build = false;
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
template<typename F>
|
|
||||||
class defer_finalizer {
|
|
||||||
F f;
|
|
||||||
bool moved;
|
|
||||||
public:
|
|
||||||
template<typename T>
|
|
||||||
defer_finalizer(T && f_) : f(std::forward<T>(f_)), moved(false) { }
|
|
||||||
|
|
||||||
defer_finalizer(const defer_finalizer &) = delete;
|
|
||||||
|
|
||||||
defer_finalizer(defer_finalizer && other) : f(std::move(other.f)), moved(other.moved) {
|
|
||||||
other.moved = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
~defer_finalizer() {
|
|
||||||
if (!moved) f();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct {
|
|
||||||
template<typename F>
|
|
||||||
defer_finalizer<F> operator<<(F && f) {
|
|
||||||
return defer_finalizer<F>(std::forward<F>(f));
|
|
||||||
}
|
|
||||||
} deferrer;
|
|
||||||
|
|
||||||
#define TOKENPASTE(x, y) x ## y
|
|
||||||
#define TOKENPASTE2(x, y) TOKENPASTE(x, y)
|
|
||||||
#define defer auto TOKENPASTE2(__deferred_lambda_call, __COUNTER__) = deferrer << [&]
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Usage of the create_error_macros:
|
Usage of the create_error_macros:
|
||||||
|
|
||||||
*/
|
*/
|
||||||
#define __create_error(keyword, ...) \
|
#define __create_error(keyword, ...) \
|
||||||
create_error( \
|
create_error( \
|
||||||
|
|||||||
@@ -8,12 +8,14 @@ proc delete_error() -> void {
|
|||||||
}
|
}
|
||||||
|
|
||||||
proc create_error(const char* c_file_name, int c_file_line, Lisp_Object* type, String* message) -> void {
|
proc create_error(const char* c_file_name, int c_file_line, Lisp_Object* type, String* message) -> void {
|
||||||
|
|
||||||
if (Globals::log_level > Log_Level::None)
|
if (Globals::log_level > Log_Level::None)
|
||||||
printf("Error created in:\n%s:%d\n", c_file_name, c_file_line);
|
printf("Error created in:\n%s:%d\n", c_file_name, c_file_line);
|
||||||
|
|
||||||
delete_error();
|
delete_error();
|
||||||
|
if (Globals::breaking_on_errors) {
|
||||||
debug_break();
|
debug_break();
|
||||||
|
}
|
||||||
// visualize_lisp_machine();
|
// visualize_lisp_machine();
|
||||||
|
|
||||||
using Globals::error;
|
using Globals::error;
|
||||||
|
|||||||
@@ -1,4 +1,6 @@
|
|||||||
proc apply_arguments_to_function(Lisp_Object* arguments, Function* function) -> Lisp_Object* {
|
proc apply_arguments_to_function(Lisp_Object* arguments, Function* function) -> Lisp_Object* {
|
||||||
|
profile_this;
|
||||||
|
|
||||||
Environment* new_env;
|
Environment* new_env;
|
||||||
try new_env = Memory::create_child_environment(function->parent_environment);
|
try new_env = Memory::create_child_environment(function->parent_environment);
|
||||||
push_environment(new_env);
|
push_environment(new_env);
|
||||||
@@ -17,10 +19,6 @@ proc apply_arguments_to_function(Lisp_Object* arguments, Function* function) ->
|
|||||||
create_wrong_number_of_arguments_error(function->positional_arguments->next_index, i);
|
create_wrong_number_of_arguments_error(function->positional_arguments->next_index, i);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// TODO(Felix): here we create new lisp_object_symbols from
|
|
||||||
// their identifiers but before we converted them to
|
|
||||||
// strings from symbols... Wo maybe just use the symbols?
|
|
||||||
|
|
||||||
// NOTE(Felix): We have to copy all the arguments, otherwise
|
// NOTE(Felix): We have to copy all the arguments, otherwise
|
||||||
// we change the program code.
|
// we change the program code.
|
||||||
try_void sym = function->positional_arguments->symbols[i];
|
try_void sym = function->positional_arguments->symbols[i];
|
||||||
@@ -527,8 +525,6 @@ proc interprete_stdin() -> void {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
Parser::environment_for_macros = user_env;
|
|
||||||
|
|
||||||
printf("Welcome to the lispy interpreter.\n");
|
printf("Welcome to the lispy interpreter.\n");
|
||||||
|
|
||||||
char* line;
|
char* line;
|
||||||
|
|||||||
@@ -30,7 +30,7 @@ namespace Memory {
|
|||||||
}
|
}
|
||||||
|
|
||||||
namespace Parser {
|
namespace Parser {
|
||||||
extern Environment* environment_for_macros;
|
// extern Environment* environment_for_macros;
|
||||||
|
|
||||||
extern String* standard_in;
|
extern String* standard_in;
|
||||||
extern String* parser_file;
|
extern String* parser_file;
|
||||||
@@ -46,5 +46,7 @@ namespace Globals {
|
|||||||
Environment_Array_List* envi_stack = create_Environment_array_list();
|
Environment_Array_List* envi_stack = create_Environment_array_list();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool breaking_on_errors = true;
|
||||||
Error* error = nullptr;
|
Error* error = nullptr;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -295,8 +295,10 @@ proc print(Lisp_Object* node, bool print_repr = false, FILE* file = stdout) -> v
|
|||||||
fputs(Memory::get_c_str(node->value.string), file);
|
fputs(Memory::get_c_str(node->value.string), file);
|
||||||
} break;
|
} break;
|
||||||
case (Lisp_Object_Type::Vector): {
|
case (Lisp_Object_Type::Vector): {
|
||||||
fputs("[vector", file);
|
fputs("[", file);
|
||||||
for (int i = 0; i < node->value.vector.length; ++i) {
|
if (node->value.vector.length > 0)
|
||||||
|
print(node->value.vector.data);
|
||||||
|
for (int i = 1; i < node->value.vector.length; ++i) {
|
||||||
fputs(" ", file);
|
fputs(" ", file);
|
||||||
print(node->value.vector.data+i);
|
print(node->value.vector.data+i);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -402,8 +402,6 @@ namespace Memory {
|
|||||||
|
|
||||||
load_built_ins_into_environment();
|
load_built_ins_into_environment();
|
||||||
|
|
||||||
Parser::environment_for_macros = ret;
|
|
||||||
|
|
||||||
// save the current working directory
|
// save the current working directory
|
||||||
char* cwd = get_cwd();
|
char* cwd = get_cwd();
|
||||||
defer {
|
defer {
|
||||||
|
|||||||
@@ -4,23 +4,31 @@ namespace Parser {
|
|||||||
int parser_line;
|
int parser_line;
|
||||||
int parser_col;
|
int parser_col;
|
||||||
|
|
||||||
// NOTE(Felix): In this environment, the build in functions will
|
proc maybe_expand_reader_macro() -> Lisp_Object* {
|
||||||
// be loaded, and the macros will be stored in form of
|
// static Lisp_Object* quote_sym = Memory::get_or_create_lisp_object_symbol("quote");
|
||||||
// special-lambdas, that get executed in this environment at
|
// static Lisp_Object* qquote_sym = Memory::get_or_create_lisp_object_symbol("quasiquote");
|
||||||
// read-time. This should always be the global environment.
|
// static Lisp_Object* unquote_sym = Memory::get_or_create_lisp_object_symbol("unquote");
|
||||||
Environment* environment_for_macros;
|
// static Lisp_Object* us_sym = Memory::get_or_create_lisp_object_symbol("unquote-splicing");
|
||||||
|
|
||||||
// proc set_environment_for_macros(Environment* env) -> void {
|
// if (text[*index_in_text] == '\'') {
|
||||||
// // NOTE(Felix): it is important to keep the parser environment
|
// *index_in_text++;
|
||||||
// // up to date with the global environment. When doing tests,
|
// return quote_sym;
|
||||||
// // or running a programm we have to reload it.
|
|
||||||
|
|
||||||
// // NOTE(Felix): For now we just allow executing built-ins at
|
|
||||||
// // read-time (while creating macros). If later we want to
|
|
||||||
// // change that, we have to define some funcions in this
|
|
||||||
// // environment.
|
|
||||||
// environment_for_macros = env;
|
|
||||||
// }
|
// }
|
||||||
|
// if (text[*index_in_text] == '`') {
|
||||||
|
// *index_in_text++;
|
||||||
|
// return qquote_sym;
|
||||||
|
// }
|
||||||
|
// if (text[*index_in_text] == ',') {
|
||||||
|
// *index_in_text++;
|
||||||
|
// return unquote_sym;
|
||||||
|
// }
|
||||||
|
// if (text[*index_in_text] == ',' && text[*index_in_text] == '@') {
|
||||||
|
// *index_in_text += 2;
|
||||||
|
// return us_sym;
|
||||||
|
// }
|
||||||
|
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
proc inject_scl(Lisp_Object* lo) -> void {
|
proc inject_scl(Lisp_Object* lo) -> void {
|
||||||
lo->sourceCodeLocation = new(Source_Code_Location);
|
lo->sourceCodeLocation = new(Source_Code_Location);
|
||||||
@@ -387,7 +395,7 @@ namespace Parser {
|
|||||||
Lisp_Object* macro;
|
Lisp_Object* macro;
|
||||||
try macro = Memory::create_lisp_object();
|
try macro = Memory::create_lisp_object();
|
||||||
Memory::set_type(macro, Lisp_Object_Type::Function);
|
Memory::set_type(macro, Lisp_Object_Type::Function);
|
||||||
macro->value.function.parent_environment = environment_for_macros;
|
macro->value.function.parent_environment = get_current_environment();
|
||||||
macro->value.function.type = Function_Type::Macro;
|
macro->value.function.type = Function_Type::Macro;
|
||||||
|
|
||||||
// if parameters were specified
|
// if parameters were specified
|
||||||
|
|||||||
@@ -0,0 +1,17 @@
|
|||||||
|
// namespace Profiler {
|
||||||
|
// proc init() -> void {
|
||||||
|
// out_file = fopen("profiler.report", "w");
|
||||||
|
// if (!out_file)
|
||||||
|
// create_generic_error("couldnt create prfiler file.");
|
||||||
|
// }
|
||||||
|
// proc exit() -> void {
|
||||||
|
// fclose(out_file);
|
||||||
|
// }
|
||||||
|
|
||||||
|
// proc log_entry(const char* func, const char* file, int line) -> void {
|
||||||
|
// fprintf(out_file,"%d -> %s %s %d %ld\n", Globals::thread_type, func, file, line, clock());
|
||||||
|
// }
|
||||||
|
// proc log_exit() -> void {
|
||||||
|
// fprintf(out_file, "%d <- %ld\n", Globals::thread_type, clock());
|
||||||
|
// }
|
||||||
|
// }
|
||||||
@@ -24,11 +24,15 @@
|
|||||||
#undef _CRT_SECURE_NO_DEPRECATE
|
#undef _CRT_SECURE_NO_DEPRECATE
|
||||||
#undef _CRT_SECURE_NO_WARNINGS
|
#undef _CRT_SECURE_NO_WARNINGS
|
||||||
|
|
||||||
|
#include "./ftb/macros.h"
|
||||||
|
#include "./ftb/profiler.hpp"
|
||||||
|
|
||||||
namespace Slime {
|
namespace Slime {
|
||||||
# include "./defines.cpp"
|
# include "./defines.cpp"
|
||||||
# include "./platform.cpp"
|
# include "./platform.cpp"
|
||||||
# include "./structs.cpp"
|
# include "./structs.cpp"
|
||||||
# include "./forward_decls.cpp"
|
# include "./forward_decls.cpp"
|
||||||
|
# include "./profiler.cpp"
|
||||||
# include "./memory.cpp"
|
# include "./memory.cpp"
|
||||||
# include "./lisp_object.cpp"
|
# include "./lisp_object.cpp"
|
||||||
# include "./error.cpp"
|
# include "./error.cpp"
|
||||||
|
|||||||
@@ -8,6 +8,13 @@ define_array_list(String*, String);
|
|||||||
define_array_list(int, Int);
|
define_array_list(int, Int);
|
||||||
define_array_list(void*, Void_Ptr);
|
define_array_list(void*, Void_Ptr);
|
||||||
|
|
||||||
|
|
||||||
|
enum struct Thread_Type {
|
||||||
|
Main,
|
||||||
|
GarbageCollection
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
enum struct Lisp_Object_Type {
|
enum struct Lisp_Object_Type {
|
||||||
Nil,
|
Nil,
|
||||||
T,
|
T,
|
||||||
|
|||||||
@@ -517,9 +517,11 @@ proc test_built_in_type() -> testresult {
|
|||||||
char exp_string3[] = "(begin (set-type a \"wrong tpye\")(type a))";
|
char exp_string3[] = "(begin (set-type a \"wrong tpye\")(type a))";
|
||||||
expression = Parser::parse_single_expression(exp_string3);
|
expression = Parser::parse_single_expression(exp_string3);
|
||||||
|
|
||||||
without_logging {
|
ignore_logging {
|
||||||
|
dont_break_on_errors {
|
||||||
result = eval_expr(expression);
|
result = eval_expr(expression);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
assert_error();
|
assert_error();
|
||||||
delete_error();
|
delete_error();
|
||||||
|
|||||||