{"id":"CPP01","repo":"lab-cpp-build-namespaces","number":"01","title":"Translation Units, Linkage and Namespaces","status":"planned"},
{"id":"CPP01","repo":"lab-cpp-build-namespaces","number":"01","title":"Oddzielna kompilacja, linkage i przestrzenie nazw","status":"existing"},
{"id":"CPP02","repo":"lab-cpp-classes-invariants","number":"02","title":"Classes, Encapsulation and Invariants","status":"planned"},
{"id":"CPP02","repo":"lab-cpp-types-initialization","number":"02","title":"Typy, inicjalizacja, auto, const i enum class","status":"existing"},
{"id":"CPP03","repo":"lab-cpp-lifetime-raii","number":"03","title":"Construction, Destruction and RAII","status":"planned"},
{"id":"CPP03","repo":"lab-cpp-pointers-references","number":"03","title":"Wskaźniki, referencje, tablice i nullptr","status":"existing"},
{"id":"CPP04","repo":"lab-cpp-references-const","number":"04","title":"References, const and Value Categories","status":"planned"},
{"id":"CPP04","repo":"lab-cpp-functions-overloading","number":"04","title":"Funkcje, przeciążanie i modułowość","status":"existing"},
{"id":"CPP05","repo":"lab-cpp-copy-move","number":"05","title":"Copy, Move and the Rule of Zero/Five","status":"planned"},
{"id":"CPP05","repo":"lab-cpp-classes-objects","number":"05","title":"Klasa i obiekt: interfejs oraz implementacja","status":"existing"},
{"id":"CPP06","repo":"lab-cpp-ownership","number":"06","title":"Ownership and Resource Types","status":"planned"},
{"id":"CPP06","repo":"lab-cpp-invariants","number":"06","title":"Hermetyzacja, niezmienniki i odpowiedzialność klasy","status":"existing"},
{"id":"CPP07","repo":"lab-cpp-templates","number":"07","title":"Function and Class Templates","status":"planned"},
{"id":"CPP07","repo":"lab-cpp-construction-destruction","number":"07","title":"Konstruktory, destruktory i inicjalizacja obiektu","status":"existing"},
{"id":"CPP08","repo":"lab-cpp-static-polymorphism","number":"08","title":"Static Polymorphism and CRTP","status":"planned"},
{"id":"CPP08","repo":"lab-cpp-scope-lifetime","number":"08","title":"Zakres i czas życia obiektów","status":"existing"},
{"id":"CPP09","repo":"lab-cpp-dynamic-polymorphism","number":"09","title":"Inheritance, Interfaces and Dynamic Dispatch","status":"planned"},
{"id":"CPP09","repo":"lab-cpp-raii","number":"09","title":"RAII i zasób związany z czasem życia","status":"existing"},
{"id":"CPP10","repo":"lab-cpp-strong-types","number":"10","title":"Operator Overloading and Strong Types","status":"planned"},
{"id":"CPP10","repo":"lab-cpp-copy-move","number":"10","title":"Kopiowanie, przenoszenie i Rule of Zero/Five","status":"existing"}
{"id":"CPP11","repo":"lab-cpp-containers-iterators","number":"11","title":"Containers, Iterators and Algorithms","status":"planned"},
{"id":"CPP12","repo":"lab-cpp-lambdas-callables","number":"12","title":"Lambdas, Function Objects and Callables","status":"planned"},
{"id":"CPP13","repo":"lab-cpp-error-models","number":"13","title":"Error Models with and without Exceptions","status":"planned"},
{"id":"CPP14","repo":"lab-cpp-abi-evidence","number":"14","title":"Object Layout, ABI and Binary Evidence","status":"planned"},
("Linkage zewnętrzny i wewnętrzny","Porównaj symbol dostępny między plikami z nazwą ukrytą w anonimowej przestrzeni nazw.","external=5 internal_bias_result=8",{
"api.hpp":"""#pragma once
int global_value();
int shifted_value();
""",
"global.cpp":"""#include "api.hpp"
int global_value() { return 5; }
""",
"shifted.cpp":"""#include "api.hpp"
namespace { constexpr int bias = 3; }
int shifted_value() { return global_value() + bias; }
("Interfejs modułu","Oddziel publiczne deklaracje statystyk od ich implementacji.","min=2 max=9",{
"stats.hpp":"""#pragma once
namespace stats { int minimum(int left, int right); int maximum(int left, int right); }
""",
"stats.cpp":"""#include "stats.hpp"
namespace stats { int minimum(int left, int right) { return left < right ? left : right; } int maximum(int left, int right) { return left > right ? left : right; } }
("Normalizacja przedziału","Skonstruuj przedział zawsze spełniający start <= end.","start=3 end=10 width=7",{
"main.cpp":"""#include <iostream>
class Interval { public: Interval(int first, int second) : start_{first < second ? first : second}, end_{first < second ? second : first} {} int start() const { return start_; } int end() const { return end_; } int width() const { return end_ - start_; } private: int start_; int end_; };
int main() { Object object; (void)object; std::cout << "ready\\n"; }
""",
}),
("Destrukcja w odwrotnej kolejności","Utwórz dwa obiekty automatyczne i sprawdź kolejność destruktorów.","enter\nconstruct=A\nconstruct=B\ndestroy=B\ndestroy=A\nleave",{
"topic":"Obiekty automatyczne, statyczne i dynamiczne oraz przesłanianie nazw",
"chapter":"A Tour of C++ 3e: sekcja 1.5 i rozdział 6",
"mission":"Powiązać miejsce przechowywania obiektu z początkiem i końcem jego czasu życia.",
"tasks":[
("Automatyczny i statyczny","Porównaj nowy obiekt automatyczny z zachowującym stan obiektem statycznym.","auto=7 static_calls=1,2",{
"main.cpp":"""#include <iostream>
int next_call() { static int calls{}; return ++calls; }
int main() { int automatic{7}; const int first = next_call(); const int second = next_call(); std::cout << "auto=" << automatic << " static_calls=" << first << ',' << second << '\\n'; }
""",
}),
("Obiekt dynamiczny","Jawnie zestaw new z delete i obserwuj moment wykonania destruktora.","construct\nvalue=11\ndestroy",{
("Rule of Zero","Zbuduj typ z bezpiecznych składowych standardowych bez własnego destruktora i operacji copy/move.","copy=alpha original=beta moved=alpha",{
"content_tex":f"{prompt} Najpierw przewidź wynik, następnie skompiluj program z ostrzeżeniami traktowanymi jako błędy i porównaj dokładny stdout z kontraktem: {expected_tex.replace(chr(10),'; ')}.",
f"{prefix}.EN01":{"text":f"Uczeń wyjaśnia reguły C++20 związane z tematem: {lesson['topic']}.","label":"Model języka","bloom_level":"Analiza","assessment_criteria":[f"{prefix}.KW01"]},
f"{prefix}.EK01":{"text":"Uczeń implementuje, kompiluje i weryfikuje trzy małe eksperymenty C++20.","label":"Eksperyment C++","bloom_level":"Zastosowanie","assessment_criteria":[f"{prefix}.KW01"]},
},
"assessment_criteria":{f"{prefix}.KW01":{"text":"Trzy taski kompilują się bez ostrzeżeń i zwracają dokładny, testowany wynik.","learning_effects":[f"{prefix}.EN01",f"{prefix}.EK01"]}},
"learning_tree":{"schema":"we-learning-tree.v1","policy":"Każde twierdzenie o języku ma dowód w kodzie, wyniku programu albo symbolach binarnych.",
"ogolne":[{"tree_id":f"{prefix}.WE01.OG.IP.01","effect_ref":f"{prefix}.EN01","display":f"EN IP {prefix}","text":"Uczeń przewiduje zachowanie programu na podstawie reguł języka.","kw":[{"criterion_ref":f"{prefix}.KW01","display":f"KW IP {prefix}","text":"Uzasadnia przewidywany wynik."}]}],
"zawodowe":[{"tree_id":f"{prefix}.WE01.TECH.I4.01","effect_ref":f"{prefix}.EK01","display":f"EK INF04 {prefix}","text":"Uczeń buduje i testuje program C++20.","kw":[{"criterion_ref":f"{prefix}.KW01","display":f"KW INF04 {prefix}","text":"Uzyskuje trzy komunikaty PASS."}]}],
"objectives":["Wyjaśnisz badaną regułę C++20.","Skompilujesz program z pełnym zestawem ostrzeżeń.","Porównasz dokładny wynik i ślad debuggera."],
"agenda":[{"time":"0--15 min","work":"Model i przewidywanie."},{"time":"15--45 min","work":"Trzy eksperymenty kodowe."},{"time":"45--60 min","work":"Debug, wnioski i raport."}],
"tech_stack":{"software":[{"name":"C++20","use":"standard języka"},{"name":"GCC/GDB","use":"kompilacja i dowód wykonania"},{"name":"stemctl","use":"izolowany profil native-amd64"}],"hardware":[{"name":"Brak","use":"laboratorium kontenerowe"}]},
"container_test":{"title":"Test w profilu native-amd64","commands":[f"stemctl test native-amd64 cpp {lesson['id']} 1",f"stemctl test native-amd64 cpp {lesson['id']} 2",f"stemctl debug native-amd64 cpp {lesson['id']} 3"],"pass_condition":"Trzy wyniki zgodne z expected i niepusty debug.log."},
"safety_rules":[{"title":"Brak niezdefiniowanego zachowania","body":"Kod testowy nie dereferencjonuje nullptr i nie używa obiektu po zakończeniu czasu życia."},{"title":"Jedna zmienna naraz","body":"Każdy task izoluje jedną regułę języka i ma deterministyczny stdout."}],
"hardware_procedure":[{"step":"1","action":"Przewidź wynik.","condition":"Reguła języka zapisana przed uruchomieniem."},{"step":"2","action":"Uruchom trzy taski.","condition":"Trzy komunikaty PASS."},{"step":"3","action":"Odczytaj debug.log.","condition":"Debugger zatrzymał program w main."}],
"references":[],
}
defgenerate_lesson(lesson:dict)->None:
repo=OUTPUT/lesson["repo"]
ifrepo.exists()and(repo/".git").exists():
raiseSystemExit(f"Refusing to overwrite Git repository: {repo}")
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.