Skip to content

Commit 5f8cf30

Browse files
committed
C++26/23 support + build fixes
Parser: - constexpr virtual ~Dtor() now recognized as destructor dispatch - contract attributes [[pre:]] [[post:]] consumed in trailing qualifier loop - if consteval: C++23 immediate-function context now parsed - = delete("reason"): C++26 string message consumed - macro preprocessor now uses -std=c++2c Build: - rebuild-jar.py: delete build artifacts instead of --rerun-tasks to avoid Kotlin daemon spawn failure on this system - CppBuild: -std=c++20 -> -std=c++2c throughout - macro preprocessor: -std=c++2c added - C++23/26 using declarations in generated preamble Processing.h: - C++23 headers guarded by __cplusplus >= 202302L - C++26 headers guarded by __has_include + version check
1 parent b21eb56 commit 5f8cf30

46 files changed

Lines changed: 5308 additions & 101791 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

mode/CppMode.jar

2.23 KB
Binary file not shown.

scripts/rebuild-jar.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,13 @@ def main():
6565
print(f"Using processing4 at: {processing4_dir}")
6666
os.utime(cppbuild_java, None)
6767

68-
run([gradlew, ":java:compileJava", "--rerun-tasks"], cwd=processing4_dir)
69-
run([gradlew, ":java:jar"], cwd=processing4_dir)
68+
# Delete build artifacts to force recompilation without triggering
69+
# the Kotlin daemon (which fails on this system with --rerun-tasks)
70+
import shutil as _shutil
71+
for d in ["java/build/classes", "java/build/libs"]:
72+
p = os.path.join(processing4_dir, d)
73+
if os.path.exists(p): _shutil.rmtree(p)
74+
run([gradlew, ":java:compileJava", ":java:jar", "--no-daemon"], cwd=processing4_dir)
7075

7176
if not os.path.exists(java_jar):
7277
print(f"ERROR: expected jar not found at {java_jar}")

scripts/rebuild-jar.py.bak_kotlin

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
#!/usr/bin/env python3
2+
"""
3+
Single, authoritative way to rebuild and deploy CppMode.jar.
4+
5+
Runs the same sequence that's been typed by hand throughout
6+
development. Looks for the processing4 checkout via the PROCESSING4_DIR
7+
environment variable first; if that isn't set, asks for the path
8+
interactively instead of failing -- so this script works for anyone,
9+
not just on a machine that already has PROCESSING4_DIR exported.
10+
11+
Setup (optional, skips the prompt every time):
12+
export PROCESSING4_DIR=/path/to/your/processing4
13+
(add that line to your ~/.bashrc to make it permanent)
14+
15+
Usage:
16+
rebuild-jar.py
17+
"""
18+
import subprocess
19+
import sys
20+
import os
21+
import glob
22+
23+
SKETCHBOOK_JAR_DEST = os.path.expanduser("~/sketchbook/modes/CppMode/mode/CppMode.jar")
24+
TMP_DIR = "/tmp/_cpp"
25+
26+
def run(cmd, cwd=None):
27+
print(f"$ {' '.join(cmd)}")
28+
result = subprocess.run(cmd, cwd=cwd)
29+
if result.returncode != 0:
30+
print(f"FAILED (exit code {result.returncode}): {' '.join(cmd)}")
31+
sys.exit(result.returncode)
32+
33+
def get_processing4_dir():
34+
env_dir = os.environ.get("PROCESSING4_DIR")
35+
if env_dir:
36+
env_dir = os.path.abspath(os.path.expanduser(env_dir))
37+
if os.path.isdir(env_dir):
38+
return env_dir
39+
print(f"WARNING: PROCESSING4_DIR is set to '{env_dir}', but that's not a real directory.")
40+
41+
entered = input("Path to your processing4 checkout: ").strip()
42+
entered = os.path.abspath(os.path.expanduser(entered))
43+
if not os.path.isdir(entered):
44+
print(f"ERROR: '{entered}' is not a directory.")
45+
sys.exit(1)
46+
return entered
47+
48+
def main():
49+
processing4_dir = get_processing4_dir()
50+
cppbuild_java = os.path.join(processing4_dir, "java/src/processing/mode/cpp/CppBuild.java")
51+
libs_dir = os.path.join(processing4_dir, "java/build/libs")
52+
# Handle both "java.jar" (older builds) and versioned "java-X.Y.Z.jar" (newer)
53+
_candidates = (
54+
glob.glob(os.path.join(libs_dir, "java.jar")) +
55+
glob.glob(os.path.join(libs_dir, "java-*.jar"))
56+
)
57+
java_jar = _candidates[0] if _candidates else os.path.join(libs_dir, "java.jar")
58+
gradlew = os.path.join(processing4_dir, "gradlew")
59+
60+
if not os.path.exists(cppbuild_java):
61+
print(f"ERROR: expected CppBuild.java not found at {cppbuild_java}")
62+
print("Is this really a processing4 checkout with CppMode's source linked in?")
63+
sys.exit(1)
64+
65+
print(f"Using processing4 at: {processing4_dir}")
66+
os.utime(cppbuild_java, None)
67+
68+
run([gradlew, ":java:compileJava", "--rerun-tasks"], cwd=processing4_dir)
69+
run([gradlew, ":java:jar"], cwd=processing4_dir)
70+
71+
if not os.path.exists(java_jar):
72+
print(f"ERROR: expected jar not found at {java_jar}")
73+
sys.exit(1)
74+
75+
run(["rm", "-rf", TMP_DIR])
76+
run(["mkdir", TMP_DIR])
77+
run(["jar", "xf", java_jar], cwd=TMP_DIR)
78+
os.makedirs(os.path.dirname(SKETCHBOOK_JAR_DEST), exist_ok=True)
79+
run(["jar", "cf", SKETCHBOOK_JAR_DEST, "processing/mode/cpp/"], cwd=TMP_DIR)
80+
81+
size = os.path.getsize(SKETCHBOOK_JAR_DEST)
82+
print()
83+
print(f"Done. Deployed CppMode.jar ({size} bytes) to {SKETCHBOOK_JAR_DEST}")
84+
85+
if __name__ == "__main__":
86+
main()
87+
88+
# Sync to Processing bundled mode dirs so IDE picks up changes immediately
89+
import shutil, pathlib
90+
jar = pathlib.Path("/home/pep/sketchbook/modes/CppMode/mode/CppMode.jar")
91+
for dest in [
92+
"/home/pep/Projects/processing4/app/build/resources-bundled/common/modes/CppMode/mode/CppMode.jar",
93+
"/home/pep/Projects/processing4/app/build/compose/tmp/prepareAppResources/modes/CppMode/mode/CppMode.jar",
94+
]:
95+
pathlib.Path(dest).parent.mkdir(parents=True, exist_ok=True)
96+
shutil.copy2(jar, dest)
97+
print(f"Synced to {dest}")
Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
#!/usr/bin/env python3
2+
"""
3+
Single, authoritative way to rebuild and deploy CppMode.jar.
4+
5+
Runs the same sequence that's been typed by hand throughout
6+
development. Looks for the processing4 checkout via the PROCESSING4_DIR
7+
environment variable first; if that isn't set, asks for the path
8+
interactively instead of failing -- so this script works for anyone,
9+
not just on a machine that already has PROCESSING4_DIR exported.
10+
11+
Setup (optional, skips the prompt every time):
12+
export PROCESSING4_DIR=/path/to/your/processing4
13+
(add that line to your ~/.bashrc to make it permanent)
14+
15+
Usage:
16+
rebuild-jar.py
17+
"""
18+
import subprocess
19+
import sys
20+
import os
21+
import glob
22+
23+
SKETCHBOOK_JAR_DEST = os.path.expanduser("~/sketchbook/modes/CppMode/mode/CppMode.jar")
24+
TMP_DIR = "/tmp/_cpp"
25+
26+
def run(cmd, cwd=None):
27+
print(f"$ {' '.join(cmd)}")
28+
result = subprocess.run(cmd, cwd=cwd)
29+
if result.returncode != 0:
30+
print(f"FAILED (exit code {result.returncode}): {' '.join(cmd)}")
31+
sys.exit(result.returncode)
32+
33+
def get_processing4_dir():
34+
env_dir = os.environ.get("PROCESSING4_DIR")
35+
if env_dir:
36+
env_dir = os.path.abspath(os.path.expanduser(env_dir))
37+
if os.path.isdir(env_dir):
38+
return env_dir
39+
print(f"WARNING: PROCESSING4_DIR is set to '{env_dir}', but that's not a real directory.")
40+
41+
entered = input("Path to your processing4 checkout: ").strip()
42+
entered = os.path.abspath(os.path.expanduser(entered))
43+
if not os.path.isdir(entered):
44+
print(f"ERROR: '{entered}' is not a directory.")
45+
sys.exit(1)
46+
return entered
47+
48+
def main():
49+
processing4_dir = get_processing4_dir()
50+
cppbuild_java = os.path.join(processing4_dir, "java/src/processing/mode/cpp/CppBuild.java")
51+
libs_dir = os.path.join(processing4_dir, "java/build/libs")
52+
# Handle both "java.jar" (older builds) and versioned "java-X.Y.Z.jar" (newer)
53+
_candidates = (
54+
glob.glob(os.path.join(libs_dir, "java.jar")) +
55+
glob.glob(os.path.join(libs_dir, "java-*.jar"))
56+
)
57+
java_jar = _candidates[0] if _candidates else os.path.join(libs_dir, "java.jar")
58+
gradlew = os.path.join(processing4_dir, "gradlew")
59+
60+
if not os.path.exists(cppbuild_java):
61+
print(f"ERROR: expected CppBuild.java not found at {cppbuild_java}")
62+
print("Is this really a processing4 checkout with CppMode's source linked in?")
63+
sys.exit(1)
64+
65+
print(f"Using processing4 at: {processing4_dir}")
66+
os.utime(cppbuild_java, None)
67+
68+
run([gradlew, ":java:compileJava", "--rerun-tasks", "-x", ":plugins:library:compileKotlin"], cwd=processing4_dir)
69+
run([gradlew, ":java:jar"], cwd=processing4_dir)
70+
71+
if not os.path.exists(java_jar):
72+
print(f"ERROR: expected jar not found at {java_jar}")
73+
sys.exit(1)
74+
75+
run(["rm", "-rf", TMP_DIR])
76+
run(["mkdir", TMP_DIR])
77+
run(["jar", "xf", java_jar], cwd=TMP_DIR)
78+
os.makedirs(os.path.dirname(SKETCHBOOK_JAR_DEST), exist_ok=True)
79+
run(["jar", "cf", SKETCHBOOK_JAR_DEST, "processing/mode/cpp/"], cwd=TMP_DIR)
80+
81+
size = os.path.getsize(SKETCHBOOK_JAR_DEST)
82+
print()
83+
print(f"Done. Deployed CppMode.jar ({size} bytes) to {SKETCHBOOK_JAR_DEST}")
84+
85+
if __name__ == "__main__":
86+
main()
87+
88+
# Sync to Processing bundled mode dirs so IDE picks up changes immediately
89+
import shutil, pathlib
90+
jar = pathlib.Path("/home/pep/sketchbook/modes/CppMode/mode/CppMode.jar")
91+
for dest in [
92+
"/home/pep/Projects/processing4/app/build/resources-bundled/common/modes/CppMode/mode/CppMode.jar",
93+
"/home/pep/Projects/processing4/app/build/compose/tmp/prepareAppResources/modes/CppMode/mode/CppMode.jar",
94+
]:
95+
pathlib.Path(dest).parent.mkdir(parents=True, exist_ok=True)
96+
shutil.copy2(jar, dest)
97+
print(f"Synced to {dest}")

src/Processing.h

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1624,6 +1624,10 @@ inline void fill(color c, int a) { fill(c, (float)a); }
16241624
// Implementations are after struct PApplet (which defines g_papplet).
16251625
struct PApplet;
16261626
namespace _api {
1627+
void size(int,int);
1628+
void size(int,int,int);
1629+
void fullScreen();
1630+
void fullScreen(int);
16271631
void line(float,float,float,float);
16281632
void line(float,float,float,float,float,float);
16291633
void rect(float,float,float,float);
@@ -3431,6 +3435,12 @@ inline PVector createVector(float x, float y, float z=0) { return PVector(x, y,
34313435
#include <type_traits>
34323436

34333437
// line()
3438+
template<typename A,typename B,typename C,typename D,
3439+
typename=std::enable_if_t<std::is_arithmetic_v<A>&&std::is_arithmetic_v<B>&&std::is_arithmetic_v<C>&&std::is_arithmetic_v<D>>>
3440+
inline void size(int w, int h){ _api::size(w,h); }
3441+
inline void size(int w, int h, int mode){ _api::size(w,h,mode); }
3442+
inline void fullScreen(){ _api::fullScreen(); }
3443+
inline void fullScreen(int mode){ _api::fullScreen(mode); }
34343444
template<typename A,typename B,typename C,typename D,
34353445
typename=std::enable_if_t<std::is_arithmetic_v<A>&&std::is_arithmetic_v<B>&&std::is_arithmetic_v<C>&&std::is_arithmetic_v<D>>>
34363446
inline void line(A x1,B y1,C x2,D y2){ _api::line((float)x1,(float)y1,(float)x2,(float)y2); }
@@ -3729,6 +3739,7 @@ struct PApplet {
37293739
void size(int w, int h);
37303740
void size(int w, int h, int renderer);
37313741
void fullScreen();
3742+
void fullScreen(int mode);
37323743
void frameRate(int fps);
37333744
void noLoop();
37343745
void loop();
@@ -4444,6 +4455,10 @@ namespace _api {
44444455
inline void tint(float r,float g,float b){ if(PApplet::g_papplet) PApplet::g_papplet->tint(r,g,b); }
44454456
inline void tint(float r,float g,float b,float a){ if(PApplet::g_papplet) PApplet::g_papplet->tint(r,g,b,a); }
44464457
inline void strokeWeight(float w){ if(PApplet::g_papplet) PApplet::g_papplet->strokeWeight(w); }
4458+
inline void size(int w, int h) { if(PApplet::g_papplet) PApplet::g_papplet->size(w,h); }
4459+
inline void size(int w, int h, int m) { if(PApplet::g_papplet) PApplet::g_papplet->size(w,h,m); }
4460+
inline void fullScreen() { if(PApplet::g_papplet) PApplet::g_papplet->fullScreen(); }
4461+
inline void fullScreen(int m) { if(PApplet::g_papplet) PApplet::g_papplet->fullScreen(m); }
44474462
} // namespace _api
44484463

44494464

src/Processing_api.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,9 +80,6 @@ inline void ellipseMode(int m) { if(::Processing::PApple
8080
inline void imageMode(int m) { if(::Processing::PApplet::g_papplet) ::Processing::PApplet::g_papplet->imageMode(m); }
8181
inline void blendMode(int m) { if(::Processing::PApplet::g_papplet) ::Processing::PApplet::g_papplet->blendMode(m); }
8282
inline void clear() { if(::Processing::PApplet::g_papplet) ::Processing::PApplet::g_papplet->clear(); }
83-
inline void size(int w,int h) { if(::Processing::PApplet::g_papplet) ::Processing::PApplet::g_papplet->size(w,h); }
84-
inline void size(int w,int h,int r) { if(::Processing::PApplet::g_papplet) ::Processing::PApplet::g_papplet->size(w,h,r); }
85-
inline void fullScreen() { if(::Processing::PApplet::g_papplet) ::Processing::PApplet::g_papplet->fullScreen(); }
8683
inline void noLoop() { if(::Processing::PApplet::g_papplet) ::Processing::PApplet::g_papplet->noLoop(); }
8784
inline void loop() { if(::Processing::PApplet::g_papplet) ::Processing::PApplet::g_papplet->loop(); }
8885
inline void redraw() { if(::Processing::PApplet::g_papplet) ::Processing::PApplet::g_papplet->redraw(); }

0 commit comments

Comments
 (0)