mirror of
https://github.com/boostorg/python.git
synced 2026-01-22 17:32:55 +00:00
Compare commits
540 Commits
svn-branch
...
svn-branch
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
9743ad0a69 | ||
|
|
432a9b85e7 | ||
|
|
9d51d39d7a | ||
|
|
a33ee22259 | ||
|
|
943b96f902 | ||
|
|
d52bc52515 | ||
|
|
fe19b49273 | ||
|
|
e56f6833e6 | ||
|
|
502e67c114 | ||
|
|
cdf49c6ac0 | ||
|
|
bbc90bcc9c | ||
|
|
2103e691db | ||
|
|
cf15a99730 | ||
|
|
a3102b552c | ||
|
|
bd0257cbe5 | ||
|
|
56e7b2a592 | ||
|
|
61d030748c | ||
|
|
f59ed991fe | ||
|
|
2bdf958663 | ||
|
|
bd8b6a2a64 | ||
|
|
88528e338b | ||
|
|
88b3bf1887 | ||
|
|
6907df1457 | ||
|
|
19036c14f5 | ||
|
|
ddb1236f2f | ||
|
|
30ef9c6418 | ||
|
|
8763fd1c53 | ||
|
|
5976005c4a | ||
|
|
63eed8994a | ||
|
|
f458dbdbcb | ||
|
|
b7421fd5cd | ||
|
|
a2feb04509 | ||
|
|
e25fee71a2 | ||
|
|
bfe2a6656c | ||
|
|
e15ca5c642 | ||
|
|
3232c5be86 | ||
|
|
1c5a50d4cb | ||
|
|
4ef5f77161 | ||
|
|
d27e5a5e1d | ||
|
|
7ecf76490c | ||
|
|
12120413f9 | ||
|
|
c0eea6e667 | ||
|
|
5c54aecdda | ||
|
|
5cfc0cce14 | ||
|
|
d9a58ef830 | ||
|
|
dfd85da9d7 | ||
|
|
94edc13393 | ||
|
|
a9baa519f3 | ||
|
|
a6c859c9cc | ||
|
|
f9a67b34b2 | ||
|
|
6ac5735d14 | ||
|
|
9d5e8b9ad8 | ||
|
|
bd72ee9cd1 | ||
|
|
c2e115b6a5 | ||
|
|
61ba4cd1ce | ||
|
|
244e0fa5e6 | ||
|
|
134bc44c45 | ||
|
|
1d2dc98f50 | ||
|
|
7a05b89a93 | ||
|
|
2bfeb20550 | ||
|
|
fa779034b5 | ||
|
|
ea5cfdcdce | ||
|
|
ba1eab1bf0 | ||
|
|
149c60bd2e | ||
|
|
9795a27482 | ||
|
|
baccdba75c | ||
|
|
93b4c6291a | ||
|
|
815edf1ba5 | ||
|
|
df7b4d81c7 | ||
|
|
3e07ba1012 | ||
|
|
32c6906750 | ||
|
|
3ebe4c47ba | ||
|
|
5b803f00e1 | ||
|
|
9a0118d991 | ||
|
|
093aae1f46 | ||
|
|
e431318dc0 | ||
|
|
c15812add2 | ||
|
|
3375cdbb49 | ||
|
|
559b564714 | ||
|
|
3ac4cfb9a7 | ||
|
|
a4d651ce9a | ||
|
|
d3bbc0eaa5 | ||
|
|
9ff90c98cd | ||
|
|
b8aaf7d7b1 | ||
|
|
c0ecde90bc | ||
|
|
83719a6f48 | ||
|
|
28011bbf55 | ||
|
|
88170f6dc4 | ||
|
|
931aab22bb | ||
|
|
6cb4fbb1c4 | ||
|
|
54a551e488 | ||
|
|
5a0d84f185 | ||
|
|
222396759b | ||
|
|
128c0ed5a1 | ||
|
|
ea74e34446 | ||
|
|
c7225a059f | ||
|
|
c1f8ae662f | ||
|
|
7d3227128c | ||
|
|
182b6755f5 | ||
|
|
0945f79ced | ||
|
|
8b611322e5 | ||
|
|
b255796b33 | ||
|
|
2ae7c60780 | ||
|
|
279ad90a3c | ||
|
|
bed7a7d29c | ||
|
|
f02a3c5b47 | ||
|
|
d7df5126ce | ||
|
|
97ecfe7e03 | ||
|
|
f30fde3a52 | ||
|
|
d7273dee1c | ||
|
|
55dff4d512 | ||
|
|
693b21188c | ||
|
|
220734ccac | ||
|
|
bf84024d6b | ||
|
|
7bb39ae541 | ||
|
|
d250057a7c | ||
|
|
d07454659a | ||
|
|
913d2984ce | ||
|
|
e2d75c0b76 | ||
|
|
8aba486295 | ||
|
|
66f2cd81a8 | ||
|
|
87bda9e124 | ||
|
|
954d019895 | ||
|
|
41132af773 | ||
|
|
9a5b89da59 | ||
|
|
c12ffa21da | ||
|
|
0b5937a396 | ||
|
|
773bb0651e | ||
|
|
8817b1e2af | ||
|
|
366ee6d24b | ||
|
|
0d58869d6e | ||
|
|
52ba3c7f80 | ||
|
|
14d2bae238 | ||
|
|
e331512473 | ||
|
|
1de6a21f3a | ||
|
|
43d8c81104 | ||
|
|
89930f34d7 | ||
|
|
59ea6b120c | ||
|
|
7c312d358b | ||
|
|
ac2746f680 | ||
|
|
e2b4178f42 | ||
|
|
266954be99 | ||
|
|
2e3ae9decb | ||
|
|
6741698f71 | ||
|
|
ccae1cc430 | ||
|
|
241a5bf4e5 | ||
|
|
e36aba8c66 | ||
|
|
1a0baef147 | ||
|
|
9a49d267eb | ||
|
|
7a832f1fdb | ||
|
|
16c391c78c | ||
|
|
92aae63af2 | ||
|
|
b042644c85 | ||
|
|
97afc4bd0c | ||
|
|
a67b29a576 | ||
|
|
97c87d0a99 | ||
|
|
fedf8d9935 | ||
|
|
23bfb84e38 | ||
|
|
c7d16fbf9e | ||
|
|
033a3dd620 | ||
|
|
f5a0b2fed8 | ||
|
|
b03dcfb7de | ||
|
|
502094439c | ||
|
|
c15f812366 | ||
|
|
dd1b102282 | ||
|
|
67b3cdc7b7 | ||
|
|
051994bdf4 | ||
|
|
0f7c12b517 | ||
|
|
aa2b0090d3 | ||
|
|
00b27c20da | ||
|
|
7ecd7e84d9 | ||
|
|
49c2dbd4a7 | ||
|
|
cf46535b66 | ||
|
|
91e2e6f207 | ||
|
|
b63434ce2e | ||
|
|
dde6c42421 | ||
|
|
beb6cca88d | ||
|
|
ba2f18ce21 | ||
|
|
c928eded74 | ||
|
|
9baefc2e56 | ||
|
|
313fe2c76c | ||
|
|
53c69e7ad5 | ||
|
|
3ff935d4c4 | ||
|
|
9fa89e8596 | ||
|
|
6c20af07f7 | ||
|
|
56abd7ba70 | ||
|
|
dc1769b28a | ||
|
|
97b863101b | ||
|
|
0a1b62a760 | ||
|
|
f2fa852f1a | ||
|
|
59f4ddf5af | ||
|
|
673d857bd8 | ||
|
|
36be16b3e9 | ||
|
|
390bb1988d | ||
|
|
63deae3ab2 | ||
|
|
710374ed1e | ||
|
|
8f1dc2522a | ||
|
|
9c3dd76e25 | ||
|
|
3328087de1 | ||
|
|
ec3f5ff40b | ||
|
|
3b000f080e | ||
|
|
09046c53ef | ||
|
|
13331d3eab | ||
|
|
a2a1a557f5 | ||
|
|
fff4cc8b0d | ||
|
|
aa0fc6dfe7 | ||
|
|
c639ac0c5a | ||
|
|
45aa77079d | ||
|
|
8e57090a75 | ||
|
|
e7cb8c8b4f | ||
|
|
57002aca36 | ||
|
|
5956d3ec77 | ||
|
|
2d522de701 | ||
|
|
aef987d832 | ||
|
|
c5d90745a0 | ||
|
|
1d160762b5 | ||
|
|
b45b9e5ccf | ||
|
|
4b9931c417 | ||
|
|
34424d7a00 | ||
|
|
7cd32fc4eb | ||
|
|
c9097566e2 | ||
|
|
e26556c631 | ||
|
|
bd32dce19a | ||
|
|
152a3f2e5f | ||
|
|
4fe6815062 | ||
|
|
525979afaa | ||
|
|
93a10f33d5 | ||
|
|
c9b4fb418a | ||
|
|
2151bf8f9a | ||
|
|
fa64ef6f00 | ||
|
|
a31c0e9082 | ||
|
|
365ce29761 | ||
|
|
93ca98d3a8 | ||
|
|
6e86a498ad | ||
|
|
94cfe30b77 | ||
|
|
cca3acc035 | ||
|
|
f0e3fd9e72 | ||
|
|
8388163aaf | ||
|
|
a203214ef9 | ||
|
|
4250893d2f | ||
|
|
0c1e2a7347 | ||
|
|
d5c35a1d83 | ||
|
|
722036f10e | ||
|
|
8eab74ea81 | ||
|
|
473d38c846 | ||
|
|
a9fb1b25a8 | ||
|
|
360dbd9e5e | ||
|
|
8c4f9d913d | ||
|
|
e4b1377b0e | ||
|
|
fc5e0fb012 | ||
|
|
9a140643c8 | ||
|
|
5fbba7bc01 | ||
|
|
4cf7ab3425 | ||
|
|
b7f93bd4ea | ||
|
|
962a08700e | ||
|
|
d23daf225d | ||
|
|
e5f2b0c0a9 | ||
|
|
6aa80b07e7 | ||
|
|
be0ae2389c | ||
|
|
7d8b6d149e | ||
|
|
a47fbc18f7 | ||
|
|
47ad802ab6 | ||
|
|
8a3e786294 | ||
|
|
4018b284e3 | ||
|
|
b704d42fe4 | ||
|
|
5dab2802b3 | ||
|
|
377fbed517 | ||
|
|
eab0a73f53 | ||
|
|
558170582a | ||
|
|
10ffaec730 | ||
|
|
f17876969d | ||
|
|
81777a29d5 | ||
|
|
3944786c13 | ||
|
|
af939fad66 | ||
|
|
79f8f3eb14 | ||
|
|
9137b38fb9 | ||
|
|
4bb5ee4b17 | ||
|
|
022c8502c0 | ||
|
|
b601ba55d0 | ||
|
|
8de3571aa8 | ||
|
|
5a6bc4404a | ||
|
|
17eb4a2660 | ||
|
|
81124780d0 | ||
|
|
aed7e14d4b | ||
|
|
6835c344eb | ||
|
|
0b965d1ee4 | ||
|
|
ed184acb40 | ||
|
|
7d7eac5030 | ||
|
|
68dbb13084 | ||
|
|
27d335ebe1 | ||
|
|
900e035412 | ||
|
|
bc552d326c | ||
|
|
7ffc983edd | ||
|
|
4a81d366bb | ||
|
|
383a51dde8 | ||
|
|
2a6060e425 | ||
|
|
576269dae9 | ||
|
|
ac34e0e108 | ||
|
|
11bd4c3223 | ||
|
|
8d88a92fe4 | ||
|
|
6004a35e23 | ||
|
|
a3a633242f | ||
|
|
4ad579d4ad | ||
|
|
2666c7312f | ||
|
|
516f30a307 | ||
|
|
9d3d50c654 | ||
|
|
453fbbed1b | ||
|
|
0ce8ab7bce | ||
|
|
d72128107e | ||
|
|
3b8dc924c3 | ||
|
|
08ac287726 | ||
|
|
a8d6f40794 | ||
|
|
a2071feeb1 | ||
|
|
aa705b07f3 | ||
|
|
fbbc1981ca | ||
|
|
6528bd0e4f | ||
|
|
81a07899ae | ||
|
|
c18d8fa967 | ||
|
|
3caa91cc36 | ||
|
|
0bdf3542e4 | ||
|
|
23769371bc | ||
|
|
bccd854676 | ||
|
|
2fa0910547 | ||
|
|
c170b1b83e | ||
|
|
be6016a972 | ||
|
|
a56f66e721 | ||
|
|
e589d7f1e1 | ||
|
|
948cde1a31 | ||
|
|
3447aaa8c6 | ||
|
|
688c64ce21 | ||
|
|
7eb42dc36b | ||
|
|
ae1c1b3a47 | ||
|
|
74078552df | ||
|
|
5da8206915 | ||
|
|
f271726cd8 | ||
|
|
22f6612354 | ||
|
|
74fe5bc4dd | ||
|
|
69d7011baf | ||
|
|
0301d4462b | ||
|
|
7c009e2443 | ||
|
|
a16d9f91ee | ||
|
|
7e76c85535 | ||
|
|
3054694726 | ||
|
|
a25021d215 | ||
|
|
532833ff70 | ||
|
|
e79a66851c | ||
|
|
97825fb2c7 | ||
|
|
bd9df7e619 | ||
|
|
087f09e9a6 | ||
|
|
1257b32464 | ||
|
|
a437af44f8 | ||
|
|
9644610e04 | ||
|
|
71cbe1cf50 | ||
|
|
edad2a1ee5 | ||
|
|
0e597f5768 | ||
|
|
b28dc55237 | ||
|
|
a2dec7a05d | ||
|
|
db9fb22cf4 | ||
|
|
412a00249f | ||
|
|
ccb7a8f94f | ||
|
|
ee26e13bea | ||
|
|
493ff9c685 | ||
|
|
bbc49e1ba3 | ||
|
|
0ef39e4440 | ||
|
|
8a956bcdf6 | ||
|
|
a16ff29638 | ||
|
|
f6381e7e5e | ||
|
|
e014765797 | ||
|
|
3899684686 | ||
|
|
e11b457b79 | ||
|
|
a04cbd111c | ||
|
|
6c7d3e1eab | ||
|
|
d965b41bdd | ||
|
|
d660c12a74 | ||
|
|
43bcbf771e | ||
|
|
7f420361b1 | ||
|
|
361455678a | ||
|
|
47c1c6288c | ||
|
|
07abc9fac4 | ||
|
|
266923d9e8 | ||
|
|
622ff9d764 | ||
|
|
b75d11da3a | ||
|
|
8af49161fb | ||
|
|
ca872af3c8 | ||
|
|
aeccf45d4e | ||
|
|
dcae0eadd5 | ||
|
|
80effaa541 | ||
|
|
edd93c80a1 | ||
|
|
39646acf5b | ||
|
|
f697d2daa1 | ||
|
|
607631604f | ||
|
|
09d012a10b | ||
|
|
b303d49634 | ||
|
|
371723a5d4 | ||
|
|
4481c3bada | ||
|
|
70bb30b95a | ||
|
|
ebc641440e | ||
|
|
586b4db968 | ||
|
|
12c7981450 | ||
|
|
08c909fd41 | ||
|
|
44e43d3b47 | ||
|
|
9e8273c7f7 | ||
|
|
93735c7bf1 | ||
|
|
e37a97e2d5 | ||
|
|
8ff5450ece | ||
|
|
5d30ddac22 | ||
|
|
80f697ef2a | ||
|
|
47c7748707 | ||
|
|
9f33aa2afc | ||
|
|
1dc6600b59 | ||
|
|
1ec58c1161 | ||
|
|
d023d577b2 | ||
|
|
21d65ca0bf | ||
|
|
bcf4401858 | ||
|
|
262396d48b | ||
|
|
0a9d5f680f | ||
|
|
64239f1c04 | ||
|
|
7590d546f1 | ||
|
|
021070f066 | ||
|
|
55a4318839 | ||
|
|
90647f30f8 | ||
|
|
8cc9080d36 | ||
|
|
6e5fc91885 | ||
|
|
71de2b5ec5 | ||
|
|
7703f91ee2 | ||
|
|
ecc8abcc50 | ||
|
|
14917c9791 | ||
|
|
25c56164b0 | ||
|
|
12988b879e | ||
|
|
684e391a9a | ||
|
|
7a16cd4c37 | ||
|
|
b3117c2b02 | ||
|
|
6a75fa83b5 | ||
|
|
88a8721b89 | ||
|
|
1f12857551 | ||
|
|
71032f6c4c | ||
|
|
088b1cab83 | ||
|
|
f40a534bfb | ||
|
|
f278530239 | ||
|
|
0389aab0a3 | ||
|
|
51a66a3202 | ||
|
|
248985e51a | ||
|
|
996d83eae0 | ||
|
|
98a1329dd7 | ||
|
|
ed2ebc7d3d | ||
|
|
41634f9998 | ||
|
|
93501af046 | ||
|
|
078585db28 | ||
|
|
03e9e4c1d9 | ||
|
|
4a1d077238 | ||
|
|
f7a5e6deb8 | ||
|
|
dabb22bb6a | ||
|
|
3d03ca3d10 | ||
|
|
386992c3b8 | ||
|
|
a48f252cfa | ||
|
|
c3a311ab85 | ||
|
|
7926e1bc3c | ||
|
|
b796db648a | ||
|
|
0964ecac8c | ||
|
|
dd1ac7952b | ||
|
|
7d1cbcb0c1 | ||
|
|
98c9e67625 | ||
|
|
aeef66ce35 | ||
|
|
8cff66e8c6 | ||
|
|
10a04acf41 | ||
|
|
9923a4c4ff | ||
|
|
0dafa9e229 | ||
|
|
e83e8a8f1c | ||
|
|
72aa768235 | ||
|
|
65c74e3976 | ||
|
|
cdac34efea | ||
|
|
03fef3106d | ||
|
|
d598d0a4db | ||
|
|
ab22e1b3a9 | ||
|
|
26d520af3c | ||
|
|
fb333f3641 | ||
|
|
1cc65a47eb | ||
|
|
8d56c52991 | ||
|
|
4b88b9eed1 | ||
|
|
462b91fb08 | ||
|
|
b65f4ff963 | ||
|
|
8d27b48225 | ||
|
|
e2623c5e82 | ||
|
|
acdae42fc5 | ||
|
|
451aac806e | ||
|
|
586e6178b4 | ||
|
|
1201761ff3 | ||
|
|
bdf68f092e | ||
|
|
a179f87d54 | ||
|
|
b2944a12de | ||
|
|
bfcb36927c | ||
|
|
ccd21d5254 | ||
|
|
a7b8448107 | ||
|
|
e934be2d99 | ||
|
|
015b875a9e | ||
|
|
1247ff2543 | ||
|
|
dc831fb3f6 | ||
|
|
94c0e947f5 | ||
|
|
ed9bc835a2 | ||
|
|
2eb2e52a79 | ||
|
|
14f6f88526 | ||
|
|
1f78c74085 | ||
|
|
c494649dde | ||
|
|
460f3aebe9 | ||
|
|
d4b215a66b | ||
|
|
1a13387012 | ||
|
|
291c36df05 | ||
|
|
bed2c8a371 | ||
|
|
e65ca4ccac | ||
|
|
f9e6933840 | ||
|
|
5134fb2ec1 | ||
|
|
3a86a69964 | ||
|
|
c6fd3c47a4 | ||
|
|
a365fa6109 | ||
|
|
160451b210 | ||
|
|
2f6e3cc09d | ||
|
|
d05cc7ccec | ||
|
|
ccfd4acbda | ||
|
|
6a6084ed0e | ||
|
|
0dbb780a2f | ||
|
|
e6efa6e13e | ||
|
|
76768120d4 | ||
|
|
7d6ff83760 | ||
|
|
5bec0d2d98 | ||
|
|
aad05325a6 | ||
|
|
6e7f1bc257 | ||
|
|
634d0848c8 | ||
|
|
b7e1059227 | ||
|
|
e7904fa67a | ||
|
|
e38bc7cbce | ||
|
|
b211f8a096 | ||
|
|
b4a1a6c688 | ||
|
|
6cb4b790b9 | ||
|
|
a245bdbc2a | ||
|
|
e63451a9e7 | ||
|
|
e552607c95 | ||
|
|
c7f1c5e29c | ||
|
|
37b6e22321 | ||
|
|
6e6ae18aab | ||
|
|
9f3cda0ac3 |
42
Jamfile
Normal file
42
Jamfile
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
subproject libs/python ;
|
||||||
|
|
||||||
|
# bring in the rules for python
|
||||||
|
SEARCH on <module@>python.jam = $(BOOST_BUILD_PATH) ;
|
||||||
|
include <module@>python.jam ;
|
||||||
|
|
||||||
|
local bpl-ldflags ;
|
||||||
|
|
||||||
|
if $(UNIX) && ( $(OS) = AIX )
|
||||||
|
{
|
||||||
|
bpl-linkflags = <linkflags>"-e initlibbpl" ;
|
||||||
|
}
|
||||||
|
|
||||||
|
dll bpl
|
||||||
|
:
|
||||||
|
src/list.cpp
|
||||||
|
src/long.cpp
|
||||||
|
src/dict.cpp
|
||||||
|
src/tuple.cpp
|
||||||
|
src/str.cpp
|
||||||
|
|
||||||
|
src/aix_init_module.cpp
|
||||||
|
src/converter/from_python.cpp
|
||||||
|
src/converter/registry.cpp
|
||||||
|
src/converter/type_id.cpp
|
||||||
|
src/object/class.cpp
|
||||||
|
src/object/function.cpp
|
||||||
|
src/object/inheritance.cpp
|
||||||
|
src/object/life_support.cpp
|
||||||
|
src/object/pickle_support.cpp
|
||||||
|
src/errors.cpp
|
||||||
|
src/module.cpp
|
||||||
|
src/converter/builtin_converters.cpp
|
||||||
|
src/converter/arg_to_python_base.cpp
|
||||||
|
src/object/iterator.cpp
|
||||||
|
src/object_protocol.cpp
|
||||||
|
src/object_operators.cpp
|
||||||
|
:
|
||||||
|
$(BOOST_PYTHON_V2_PROPERTIES)
|
||||||
|
<define>BOOST_PYTHON_SOURCE
|
||||||
|
$(bpl-linkflags)
|
||||||
|
;
|
||||||
250
build/Jamfile
250
build/Jamfile
@@ -5,13 +5,16 @@
|
|||||||
#
|
#
|
||||||
# Boost.Python build and test Jamfile
|
# Boost.Python build and test Jamfile
|
||||||
#
|
#
|
||||||
|
# To run all tests quietly: jam test
|
||||||
|
# To run all tests with verbose output: jam -sPYTHON_TEST_ARGS=-v test
|
||||||
|
#
|
||||||
# Declares the following targets:
|
# Declares the following targets:
|
||||||
# 1. libboost_python, a static link library to be linked with all
|
# 1. libboost_python.dll/.so, a dynamic library to be linked with all
|
||||||
# Boost.Python modules
|
# Boost.Python modules
|
||||||
#
|
#
|
||||||
# 2. pairs of test targets of the form <name>.test and <name>.run
|
# 2. pairs of test targets of the form <name>.test and <name>.run
|
||||||
# <name>.test runs the test when it is out-of-date, and the "all" target
|
# <name>.test runs the test when it is out-of-date, and the "test"
|
||||||
# depends on it so that it it is built by default. <name>.run runs
|
# pseudotarget depends on it. <name>.run runs
|
||||||
# a test unconditionally, and can be used to force a test to run.. Each
|
# a test unconditionally, and can be used to force a test to run.. Each
|
||||||
# test target builds one or more Boost.Python modules and runs a Python
|
# test target builds one or more Boost.Python modules and runs a Python
|
||||||
# script to test them. The test names are:
|
# script to test them. The test names are:
|
||||||
@@ -38,6 +41,12 @@
|
|||||||
#
|
#
|
||||||
# subproject-specific environment/command-line variables:
|
# subproject-specific environment/command-line variables:
|
||||||
#
|
#
|
||||||
|
# PYTHON - How to invoke the Python interpreter. Defaults to "python"
|
||||||
|
#
|
||||||
|
# PYTHON_ROOT - Windows only: where Python is installed. Defaults to "c:/tools/python"
|
||||||
|
#
|
||||||
|
# PYTHON_VERSION - Version of Python. Defaults to "2.1" on Windows, "1.5" on Unix
|
||||||
|
#
|
||||||
# PYTHON_TEST_ARGS - specifies arguments to be passed to test scripts on
|
# PYTHON_TEST_ARGS - specifies arguments to be passed to test scripts on
|
||||||
# the command line. "-v" can be useful if you want to
|
# the command line. "-v" can be useful if you want to
|
||||||
# see the output of successful tests.
|
# see the output of successful tests.
|
||||||
@@ -45,34 +54,26 @@
|
|||||||
# PYTHON_VECT_ITERATIONS - specifies the number of test iterations to use for
|
# PYTHON_VECT_ITERATIONS - specifies the number of test iterations to use for
|
||||||
# the dvect and ivect tests above.
|
# the dvect and ivect tests above.
|
||||||
|
|
||||||
|
|
||||||
# declare the location of this subproject relative to the root
|
# declare the location of this subproject relative to the root
|
||||||
subproject libs/python/build ;
|
subproject libs/python/build ;
|
||||||
|
|
||||||
# Do some OS-specific setup
|
# bring in the rules for python
|
||||||
if $(NT)
|
SEARCH on <module@>python.jam = $(BOOST_BUILD_PATH) ;
|
||||||
{
|
include <module@>python.jam ;
|
||||||
PYTHON_ROOT ?= c:/tools/python ;
|
|
||||||
PYTHON_INCLUDES ?= <include>$(PYTHON_ROOT)/include <gcc><*><include>/usr/include/python2.1 ;
|
|
||||||
PYTHON_LIBS ?= c:/cygnus/lib/python2.1/config/libpython2.1.dll.a ;
|
|
||||||
PYTHON_LIB_PATH = $(PYTHON_ROOT)/libs ;
|
|
||||||
|
|
||||||
# common properties required for compiling any Python module.
|
# This nasty hack works with versions of Python 1.5.2 -> 2.2 to avoid
|
||||||
PYTHON_PROPERTIES ?=
|
# building any Python stuff if there's no installation.
|
||||||
<gcc><*><define>SIZEOF_LONG=4
|
SEARCH on <find-python-install>__init__.py = $(PYTHON_STDLIB_PATH)/test $(SUBDIR) ;
|
||||||
<gcc><*><define>USE_DL_IMPORT
|
include <find-python-install>__init__.py ;
|
||||||
<runtime-link>dynamic
|
if ! $(gNO_PYTHON_INSTALL)
|
||||||
;
|
|
||||||
|
|
||||||
SHELL_SET ?= "set " ;
|
|
||||||
SHELL_EXPORT ?= ; # shell variables are exported by default
|
|
||||||
}
|
|
||||||
else if $(UNIX)
|
|
||||||
{
|
{
|
||||||
PYTHON_INCLUDES ?= <include>/usr/include/python1.5 ;
|
|
||||||
PYTHON_LIBS ?= /usr/lib/python1.5/config/libpython1.5.a ;
|
local PYTHON_PROPERTIES = $(PYTHON_PROPERTIES) <define>BOOST_PYTHON_DYNAMIC_LIB ;
|
||||||
SHELL_SET ?= "" ;
|
|
||||||
SHELL_EXPORT ?= "export " ;
|
#######################
|
||||||
|
rule bpl-test ( test-name : sources + )
|
||||||
|
{
|
||||||
|
boost-python-test $(test-name) : $(sources) <dll>boost_python ;
|
||||||
}
|
}
|
||||||
|
|
||||||
#######################
|
#######################
|
||||||
@@ -81,165 +82,92 @@ else if $(UNIX)
|
|||||||
# Declare the boost python static link library
|
# Declare the boost python static link library
|
||||||
#
|
#
|
||||||
|
|
||||||
# standard include requirements for anything using Boost.Python
|
|
||||||
BOOST_PYTHON_INCLUDES = <include>$(BOOST_ROOT) $(PYTHON_INCLUDES) ;
|
|
||||||
|
|
||||||
# Base names of the source files for libboost_python
|
# Base names of the source files for libboost_python
|
||||||
CPP_SOURCES =
|
local CPP_SOURCES =
|
||||||
classes conversions extension_class functions
|
types classes conversions extension_class functions
|
||||||
init_function module_builder objects types cross_module ;
|
init_function module_builder objects cross_module errors
|
||||||
|
;
|
||||||
|
|
||||||
lib libboost_python : ../src/$(CPP_SOURCES).cpp
|
lib boost_python_static : ../src/$(CPP_SOURCES).cpp
|
||||||
# requirements
|
# requirements
|
||||||
: $(BOOST_PYTHON_INCLUDES)
|
: $(BOOST_PYTHON_INCLUDES)
|
||||||
<shared-linkable>true
|
<shared-linkable>true
|
||||||
$(PYTHON_PROPERTIES) ;
|
<define>BOOST_PYTHON_STATIC_LIB=1
|
||||||
|
[ difference $(PYTHON_PROPERTIES) : <define>BOOST_PYTHON_DYNAMIC_LIB ]
|
||||||
#######################
|
: <suppress>true # don't build this unless the user asks for it by name
|
||||||
|
;
|
||||||
|
|
||||||
# boost-python name : sources : requirements : default-BUILD
|
dll boost_python
|
||||||
#
|
# $(SUFDLL[1])
|
||||||
# Declare a boost python module. Return a list of the DLL files generated.
|
: ../src/$(CPP_SOURCES).cpp
|
||||||
rule boost-python
|
# requirements
|
||||||
{
|
: $(BOOST_PYTHON_INCLUDES)
|
||||||
# declare a DLL; add the boost python library to sources
|
<shared-linkable>true
|
||||||
dll $(<) : <lib>libboost_python $(>)
|
<runtime-link>dynamic
|
||||||
|
$(PYTHON_PROPERTIES)
|
||||||
# Requirements
|
;
|
||||||
: $(3) # caller-specified requirements
|
|
||||||
|
|
||||||
# standard requirements
|
|
||||||
$(BOOST_PYTHON_INCLUDES)
|
|
||||||
<msvc><*><library-path>$(PYTHON_LIB_PATH)
|
|
||||||
<gcc><*><library-file>$(PYTHON_LIBS)
|
|
||||||
$(PYTHON_PROPERTIES)
|
|
||||||
|
|
||||||
: $(4) ; # pass on the default-BUILD, if any
|
|
||||||
}
|
|
||||||
|
|
||||||
#######################
|
stage bin-stage : <dll>boost_python
|
||||||
|
:
|
||||||
# boost-python-test target : python-script sources : requirements : local-build : args
|
<tag><debug>"_debug"
|
||||||
#
|
<tag><debug-python>"_pydebug"
|
||||||
# declare two python module tests: $(<).test which builds when out-of-date, and
|
:
|
||||||
# $(<).run which builds unconditionally.
|
debug release
|
||||||
rule boost-python-test
|
;
|
||||||
{
|
|
||||||
# tell Jam that the python script is relative to this directory
|
|
||||||
SEARCH on $(>[1]) = $(SEARCH_SOURCE) ;
|
|
||||||
|
|
||||||
# required command-line args can be specified in argument 5
|
|
||||||
# The user can add additional arguments in PYTHON_TEST_ARGS.
|
|
||||||
local gPYTHON_TEST_ARGS = $(5) $(PYTHON_TEST_ARGS) ;
|
|
||||||
|
|
||||||
# declare the two subsidiary tests.
|
|
||||||
declare-local-target $(<:S=.test) : $(>) : $(PYTHON_PROPERTIES) : $(4) : PYTHON_TEST ;
|
|
||||||
declare-local-target $(<:S=.run) : $(>) : $(PYTHON_PROPERTIES) : $(4) : PYTHON_RUNTEST ;
|
|
||||||
}
|
|
||||||
|
|
||||||
# how do we invoke python?
|
|
||||||
PYTHON ?= python ;
|
|
||||||
|
|
||||||
# special rules for two new target types: PYTHON_TEST and PYTHON_RUNTEST.
|
|
||||||
# These are identical except that PYTHON_TEST runs the test when out-of-date, and
|
|
||||||
# PYTHON_RUNTEST runs the test unconditionally. These are used by boost-python-test.
|
|
||||||
SUFPYTHON_TEST = .test ;
|
|
||||||
gGENERATOR_FUNCTION(PYTHON_TEST) = python-test-target ;
|
|
||||||
rule python-test-target # test-target : sources :
|
|
||||||
{
|
|
||||||
python-test-aux $(<) : $(>) ;
|
|
||||||
Clean clean : $(<) ; # remove the test-target as part of any clean operation
|
|
||||||
type-DEPENDS test : $(<) ;
|
|
||||||
MakeLocate $(<) : $(LOCATE_TARGET) ;
|
|
||||||
}
|
|
||||||
actions python-test-target
|
|
||||||
{
|
|
||||||
$(SHELL_SET)PYTHONPATH=$(PYTHONPATH)
|
|
||||||
$(SHELL_EXPORT)PYTHONPATH
|
|
||||||
$(PYTHON) "$(>)" $(ARGS) > "$(<)"
|
|
||||||
}
|
|
||||||
|
|
||||||
SUFPYTHON_RUNTEST = .run ;
|
|
||||||
gGENERATOR_FUNCTION(PYTHON_RUNTEST) = python-runtest-target ;
|
|
||||||
rule python-runtest-target # test-target : sources :
|
|
||||||
{
|
|
||||||
python-test-aux $(<) : $(>) ;
|
|
||||||
NOTFILE $(<) ;
|
|
||||||
ALWAYS $(<) ;
|
|
||||||
}
|
|
||||||
actions python-runtest-target
|
|
||||||
{
|
|
||||||
$(SHELL_SET)PYTHONPATH=$(PYTHONPATH)
|
|
||||||
$(SHELL_EXPORT)PYTHONPATH
|
|
||||||
$(PYTHON) "$(>)" $(ARGS)
|
|
||||||
}
|
|
||||||
|
|
||||||
rule python-test-aux # target : sources
|
|
||||||
{
|
|
||||||
DEPENDS $(<) : $(>) ;
|
|
||||||
|
|
||||||
ARGS on $(<) += $(gPYTHON_TEST_ARGS) ;
|
|
||||||
|
|
||||||
# Some tests need an extra command-line arg if built with
|
|
||||||
# msvc. Checking the target grist is a cheap way to
|
|
||||||
# find out.
|
|
||||||
switch $(<)
|
|
||||||
{
|
|
||||||
case <*\\\\msvc\\\\*>* : ARGS on $(<) += --broken-auto-ptr ;
|
|
||||||
}
|
|
||||||
|
|
||||||
# compute the PYTHONPATH environment variable that will allow the test to
|
|
||||||
# find all of the modules on which it depends.
|
|
||||||
PYTHONPATH on $(<) = [ join
|
|
||||||
$(gLOCATE($(>[1]))) # location of python test file
|
|
||||||
$(gRUN_PATH($(<))) # location of module dependencies
|
|
||||||
[ join-path $(TOP) libs python test ] # location of doctest
|
|
||||||
$(PYTHONPATH) # base PYTHONPATH from environment
|
|
||||||
: $(SPLITPATH) ] ; # platform path separator
|
|
||||||
}
|
|
||||||
|
|
||||||
############# comprehensive module and test ###########
|
############# comprehensive module and test ###########
|
||||||
boost-python boost_python_test : ../test/comprehensive.cpp ;
|
bpl-test boost_python_test
|
||||||
boost-python-test comprehensive : [ join-path $(DOTDOT) test comprehensive.py ] <lib>boost_python_test ;
|
: ../test/comprehensive.cpp ;
|
||||||
|
|
||||||
|
boost-python-runtest comprehensive
|
||||||
|
: ../test/comprehensive.py <pyd>boost_python_test <dll>boost_python ;
|
||||||
|
|
||||||
############# simple tests from ../example ############
|
############# simple tests from ../example ############
|
||||||
|
|
||||||
rule boost-python-example-test
|
rule boost-python-example-runtest ( name )
|
||||||
{
|
{
|
||||||
boost-python $(<) : ../example/$(<).cpp ;
|
bpl-test $(name)
|
||||||
boost-python-test $(<) : [ join-path $(DOTDOT) example test_$(<).py ] <lib>$(<) ;
|
: ../example/$(name).cpp ;
|
||||||
|
|
||||||
|
boost-python-runtest $(name)
|
||||||
|
: ../example/test_$(name).py <pyd>$(name) <dll>boost_python ;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
boost-python-example-test abstract ;
|
boost-python-example-runtest abstract ;
|
||||||
boost-python-example-test getting_started1 ;
|
boost-python-example-runtest getting_started1 ;
|
||||||
boost-python-example-test getting_started2 ;
|
boost-python-example-runtest getting_started2 ;
|
||||||
boost-python-example-test simple_vector ;
|
boost-python-example-runtest simple_vector ;
|
||||||
boost-python-example-test do_it_yourself_convts ;
|
boost-python-example-runtest do_it_yourself_convts ;
|
||||||
boost-python-example-test pickle1 ;
|
boost-python-example-runtest pickle1 ;
|
||||||
boost-python-example-test pickle2 ;
|
boost-python-example-runtest pickle2 ;
|
||||||
boost-python-example-test pickle3 ;
|
boost-python-example-runtest pickle3 ;
|
||||||
|
|
||||||
|
|
||||||
boost-python ivect : ../example/ivect.cpp ;
|
bpl-test ivect : ../example/ivect.cpp ;
|
||||||
boost-python dvect : ../example/dvect.cpp ;
|
bpl-test dvect : ../example/dvect.cpp ;
|
||||||
boost-python noncopyable_export : ../example/noncopyable_export.cpp ;
|
bpl-test noncopyable_export : ../example/noncopyable_export.cpp ;
|
||||||
boost-python noncopyable_import : ../example/noncopyable_import.cpp ;
|
bpl-test noncopyable_import : ../example/noncopyable_import.cpp ;
|
||||||
|
|
||||||
############## cross-module tests from ../example ##########
|
############## cross-module tests from ../example ##########
|
||||||
|
|
||||||
# A simple rule to build a test which depends on multiple modules in the PYTHONPATH
|
# A simple rule to build a test which depends on multiple modules in the PYTHONPATH
|
||||||
rule boost-python-multi-example-test # test-name : python-file libs
|
rule boost-python-multi-example-runtest ( test-name : modules + )
|
||||||
{
|
{
|
||||||
boost-python-test $(<) : ../example/tst_$(<).py <lib>$(>) : : : $(PYTHON_VECT_ITERATIONS) ;
|
boost-python-runtest $(test-name)
|
||||||
|
: ../example/tst_$(test-name).py <pyd>$(modules) <dll>boost_python
|
||||||
|
: : : $(PYTHON_VECT_ITERATIONS) ;
|
||||||
}
|
}
|
||||||
|
|
||||||
PYTHON_VECT_ITERATIONS ?= 10 ;
|
PYTHON_VECT_ITERATIONS ?= 10 ;
|
||||||
|
|
||||||
boost-python-multi-example-test dvect1 : ivect dvect ;
|
boost-python-multi-example-runtest dvect1 : ivect dvect ;
|
||||||
boost-python-multi-example-test dvect2 : ivect dvect ;
|
boost-python-multi-example-runtest dvect2 : ivect dvect ;
|
||||||
|
|
||||||
boost-python-multi-example-test ivect1 : ivect dvect ;
|
boost-python-multi-example-runtest ivect1 : ivect dvect ;
|
||||||
boost-python-multi-example-test ivect2 : ivect dvect ;
|
boost-python-multi-example-runtest ivect2 : ivect dvect ;
|
||||||
|
|
||||||
boost-python-multi-example-test noncopyable : noncopyable_import noncopyable_export ;
|
boost-python-multi-example-runtest
|
||||||
|
noncopyable : noncopyable_import noncopyable_export ;
|
||||||
|
|
||||||
|
}
|
||||||
22
build/__init__.py
Normal file
22
build/__init__.py
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
# Dummy file actually to be included by Jam when the python headers
|
||||||
|
# can't be found
|
||||||
|
|
||||||
|
if ! $(gNO_PYTHON_INSTALL)
|
||||||
|
{
|
||||||
|
ECHO "---------------------------------------------------------------------" ;
|
||||||
|
ECHO skipping Boost.Python library build ;
|
||||||
|
ECHO You can configure the location of your python installation, by setting: ;
|
||||||
|
ECHO "PYTHON_ROOT - currently" \"$(PYTHON_ROOT:J=" ")\" ;
|
||||||
|
ECHO "PYTHON_VERSION - The 2-part python Major.Minor version number (e.g." ;
|
||||||
|
ECHO " \"2.2\", NOT \"2.2.1\") - currently" \"$(PYTHON_VERSION)\" ;
|
||||||
|
ECHO ;
|
||||||
|
ECHO "The following are automatically configured from PYTHON_ROOT if not" ;
|
||||||
|
ECHO "otherwise set:" ;
|
||||||
|
ECHO " PYTHON_INCLUDES - path to Python #include directories; currently" \"$(PYTHON_INCLUDES:J=" ")\" ;
|
||||||
|
ECHO " PYTHON_LIB_PATH - path to Python library; currently" ;
|
||||||
|
ECHO " " \"$(PYTHON_LIB_PATH:J=" ")\" ;
|
||||||
|
ECHO " PYTHON_STDLIB_PATH - path to Python standard library modules; currently" ;
|
||||||
|
ECHO " " \"$(PYTHON_STDLIB_PATH:J=" ")\" ;
|
||||||
|
ECHO "---------------------------------------------------------------------" ;
|
||||||
|
}
|
||||||
|
gNO_PYTHON_INSTALL ?= true ;
|
||||||
@@ -1,241 +0,0 @@
|
|||||||
# Microsoft Developer Studio Project File - Name="bpl_static" - Package Owner=<4>
|
|
||||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
|
||||||
# ** DO NOT EDIT **
|
|
||||||
|
|
||||||
# TARGTYPE "Win32 (x86) Static Library" 0x0104
|
|
||||||
|
|
||||||
CFG=bpl_static - Win32 DebugPython
|
|
||||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
|
||||||
!MESSAGE use the Export Makefile command and run
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "bpl_static.mak".
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE You can specify a configuration when running NMAKE
|
|
||||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "bpl_static.mak" CFG="bpl_static - Win32 DebugPython"
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE Possible choices for configuration are:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE "bpl_static - Win32 Release" (based on "Win32 (x86) Static Library")
|
|
||||||
!MESSAGE "bpl_static - Win32 Debug" (based on "Win32 (x86) Static Library")
|
|
||||||
!MESSAGE "bpl_static - Win32 DebugPython" (based on "Win32 (x86) Static Library")
|
|
||||||
!MESSAGE
|
|
||||||
|
|
||||||
# Begin Project
|
|
||||||
# PROP AllowPerConfigDependencies 0
|
|
||||||
# PROP Scc_ProjName ""
|
|
||||||
# PROP Scc_LocalPath ""
|
|
||||||
CPP=cl.exe
|
|
||||||
RSC=rc.exe
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "bpl_static - Win32 Release"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 0
|
|
||||||
# PROP BASE Output_Dir "Release"
|
|
||||||
# PROP BASE Intermediate_Dir "Release"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 0
|
|
||||||
# PROP Output_Dir "Release"
|
|
||||||
# PROP Intermediate_Dir "Release"
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
|
|
||||||
# ADD CPP /nologo /MD /W4 /WX /GR /GX /O2 /I "..\..\.." /I "c:\tools\python\include" /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /FR /YX /FD /c
|
|
||||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LIB32=link.exe -lib
|
|
||||||
# ADD BASE LIB32 /nologo
|
|
||||||
# ADD LIB32 /nologo
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "bpl_static - Win32 Debug"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "Debug"
|
|
||||||
# PROP BASE Intermediate_Dir "Debug"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "Debug"
|
|
||||||
# PROP Intermediate_Dir "Debug"
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
|
|
||||||
# ADD CPP /nologo /MDd /W4 /WX /Gm- /GR /GX /Zi /Od /I "..\..\.." /I "c:\tools\python\include" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /FR /YX /FD /GZ /c
|
|
||||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LIB32=link.exe -lib
|
|
||||||
# ADD BASE LIB32 /nologo
|
|
||||||
# ADD LIB32 /nologo
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "bpl_static - Win32 DebugPython"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "bpl_static___Win32_DebugPython"
|
|
||||||
# PROP BASE Intermediate_Dir "bpl_static___Win32_DebugPython"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "DebugPython"
|
|
||||||
# PROP Intermediate_Dir "DebugPython"
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MDd /W4 /WX /Gm /GR /GX /Zi /Od /I "..\..\.." /I "c:\tools\python\include" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /FR /YX /FD /GZ /c
|
|
||||||
# ADD CPP /nologo /MDd /W4 /WX /Gm- /GR /GX /Zi /Od /I "..\..\.." /I "c:\tools\python\include" /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /D "BOOST_DEBUG_PYTHON" /FR /YX /FD /GZ /EHs /c
|
|
||||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LIB32=link.exe -lib
|
|
||||||
# ADD BASE LIB32 /nologo
|
|
||||||
# ADD LIB32 /nologo
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# Begin Target
|
|
||||||
|
|
||||||
# Name "bpl_static - Win32 Release"
|
|
||||||
# Name "bpl_static - Win32 Debug"
|
|
||||||
# Name "bpl_static - Win32 DebugPython"
|
|
||||||
# Begin Group "Source Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\src\classes.cpp
|
|
||||||
# ADD CPP /W3
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\src\conversions.cpp
|
|
||||||
# ADD CPP /W3
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\src\extension_class.cpp
|
|
||||||
# ADD CPP /W3
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\src\functions.cpp
|
|
||||||
# ADD CPP /W3
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\src\init_function.cpp
|
|
||||||
# ADD CPP /W3
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\src\module_builder.cpp
|
|
||||||
# ADD CPP /W3
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\src\objects.cpp
|
|
||||||
# ADD CPP /W3
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\src\types.cpp
|
|
||||||
# ADD CPP /W3
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "Header Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\boost\python\detail\base_object.hpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\boost\python\callback.hpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\boost\python\caller.hpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\boost\python\detail\cast.hpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\boost\python\class_builder.hpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\boost\python\classes.hpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\boost\python\detail\config.hpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\boost\python\conversions.hpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\boost\python\errors.hpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\boost\python\detail\extension_class.hpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\boost\python\detail\functions.hpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\boost\python\detail\init_function.hpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\boost\python\module_builder.hpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\boost\python\detail\none.hpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\boost\python\objects.hpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\boost\python\operators.hpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\boost\python\reference.hpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\boost\python\detail\signatures.hpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\boost\python\detail\singleton.hpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\boost\python\detail\types.hpp
|
|
||||||
# End Source File
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\..\boost\python\detail\wrap_python.hpp
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# End Target
|
|
||||||
# End Project
|
|
||||||
108
build/build.dsw
108
build/build.dsw
@@ -1,108 +0,0 @@
|
|||||||
Microsoft Developer Studio Workspace File, Format Version 6.00
|
|
||||||
# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE!
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "bpl_static"=.\bpl_static.dsp - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "example1"=.\example1\example1.dsp - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
Begin Project Dependency
|
|
||||||
Project_Dep_Name bpl_static
|
|
||||||
End Project Dependency
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "getting_started1"=.\getting_started1\getting_started1.dsp - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
Begin Project Dependency
|
|
||||||
Project_Dep_Name bpl_static
|
|
||||||
End Project Dependency
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "getting_started2"=.\getting_started2\getting_started2.dsp - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
begin source code control
|
|
||||||
getting_started2
|
|
||||||
.\getting_started2
|
|
||||||
end source code control
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
Begin Project Dependency
|
|
||||||
Project_Dep_Name bpl_static
|
|
||||||
End Project Dependency
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "rwgk1"=.\rwgk1\rwgk1.dsp - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
Begin Project Dependency
|
|
||||||
Project_Dep_Name bpl_static
|
|
||||||
End Project Dependency
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Project: "test"=.\test\test.dsp - Package Owner=<4>
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<4>
|
|
||||||
{{{
|
|
||||||
Begin Project Dependency
|
|
||||||
Project_Dep_Name bpl_static
|
|
||||||
End Project Dependency
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
Global:
|
|
||||||
|
|
||||||
Package=<5>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
Package=<3>
|
|
||||||
{{{
|
|
||||||
}}}
|
|
||||||
|
|
||||||
###############################################################################
|
|
||||||
|
|
||||||
BIN
build/build.opt
BIN
build/build.opt
Binary file not shown.
@@ -7,6 +7,7 @@ LIBSRC = \
|
|||||||
classes.cpp \
|
classes.cpp \
|
||||||
conversions.cpp \
|
conversions.cpp \
|
||||||
cross_module.cpp \
|
cross_module.cpp \
|
||||||
|
errors.cpp \
|
||||||
extension_class.cpp \
|
extension_class.cpp \
|
||||||
functions.cpp \
|
functions.cpp \
|
||||||
init_function.cpp \
|
init_function.cpp \
|
||||||
|
|||||||
@@ -1,136 +0,0 @@
|
|||||||
# Microsoft Developer Studio Project File - Name="example1" - Package Owner=<4>
|
|
||||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
|
||||||
# ** DO NOT EDIT **
|
|
||||||
|
|
||||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
|
||||||
|
|
||||||
CFG=example1 - Win32 DebugPython
|
|
||||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
|
||||||
!MESSAGE use the Export Makefile command and run
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "example1.mak".
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE You can specify a configuration when running NMAKE
|
|
||||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "example1.mak" CFG="example1 - Win32 DebugPython"
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE Possible choices for configuration are:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE "example1 - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
|
|
||||||
!MESSAGE "example1 - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
|
|
||||||
!MESSAGE "example1 - Win32 DebugPython" (based on "Win32 (x86) Dynamic-Link Library")
|
|
||||||
!MESSAGE
|
|
||||||
|
|
||||||
# Begin Project
|
|
||||||
# PROP AllowPerConfigDependencies 0
|
|
||||||
# PROP Scc_ProjName ""
|
|
||||||
# PROP Scc_LocalPath ""
|
|
||||||
CPP=cl.exe
|
|
||||||
MTL=midl.exe
|
|
||||||
RSC=rc.exe
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "example1 - Win32 Release"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 0
|
|
||||||
# PROP BASE Output_Dir "Release"
|
|
||||||
# PROP BASE Intermediate_Dir "Release"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 0
|
|
||||||
# PROP Output_Dir "Release"
|
|
||||||
# PROP Intermediate_Dir "Release"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXAMPLE1_EXPORTS" /YX /FD /c
|
|
||||||
# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\..\.." /I "c:\tools\python\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXAMPLE1_EXPORTS" /YX /FD /c
|
|
||||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
|
||||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
|
||||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"Release/hello.dll" /libpath:"c:\tools\python\libs"
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "example1 - Win32 Debug"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "Debug"
|
|
||||||
# PROP BASE Intermediate_Dir "Debug"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "Debug"
|
|
||||||
# PROP Intermediate_Dir "Debug"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXAMPLE1_EXPORTS" /YX /FD /GZ /c
|
|
||||||
# ADD CPP /nologo /MDd /W3 /Gm- /GR /GX /Zi /Od /I "..\..\..\.." /I "c:\tools\python\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXAMPLE1_EXPORTS" /YX /FD /GZ /c
|
|
||||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"Debug/hello.dll" /pdbtype:sept /libpath:"c:\tools\python\libs"
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "example1 - Win32 DebugPython"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "example1___Win32_DebugPython"
|
|
||||||
# PROP BASE Intermediate_Dir "example1___Win32_DebugPython"
|
|
||||||
# PROP BASE Ignore_Export_Lib 0
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "DebugPython"
|
|
||||||
# PROP Intermediate_Dir "DebugPython"
|
|
||||||
# PROP Ignore_Export_Lib 1
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MDd /W3 /Gm /GR /GX /Zi /Od /I "..\..\..\.." /I "c:\tools\python\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXAMPLE1_EXPORTS" /YX /FD /GZ /c
|
|
||||||
# ADD CPP /nologo /MDd /W3 /Gm- /GR /GX /Zi /Od /I "..\..\..\.." /I "c:\tools\python\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "EXAMPLE1_EXPORTS" /D "BOOST_DEBUG_PYTHON" /YX /FD /GZ /EHs /c
|
|
||||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"Debug/hello.dll" /pdbtype:sept /libpath:"c:\tools\python\libs"
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"DebugPython/hello_d.dll" /pdbtype:sept /libpath:"c:\tools\python\src\PCbuild"
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# Begin Target
|
|
||||||
|
|
||||||
# Name "example1 - Win32 Release"
|
|
||||||
# Name "example1 - Win32 Debug"
|
|
||||||
# Name "example1 - Win32 DebugPython"
|
|
||||||
# Begin Group "Source Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\example\example1.cpp
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "Header Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
|
||||||
# End Group
|
|
||||||
# Begin Group "Resource Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
|
||||||
# End Group
|
|
||||||
# End Target
|
|
||||||
# End Project
|
|
||||||
@@ -8,6 +8,7 @@ bpl_exa = "/libs/python/example"
|
|||||||
files = (
|
files = (
|
||||||
bpl_src + "/classes.cpp",
|
bpl_src + "/classes.cpp",
|
||||||
bpl_src + "/conversions.cpp",
|
bpl_src + "/conversions.cpp",
|
||||||
|
bpl_src + "/errors.cpp",
|
||||||
bpl_src + "/extension_class.cpp",
|
bpl_src + "/extension_class.cpp",
|
||||||
bpl_src + "/functions.cpp",
|
bpl_src + "/functions.cpp",
|
||||||
bpl_src + "/init_function.cpp",
|
bpl_src + "/init_function.cpp",
|
||||||
@@ -24,6 +25,7 @@ bpl_exa + "/getting_started1.cpp",
|
|||||||
bpl_exa + "/getting_started2.cpp",
|
bpl_exa + "/getting_started2.cpp",
|
||||||
bpl_exa + "/simple_vector.cpp",
|
bpl_exa + "/simple_vector.cpp",
|
||||||
bpl_exa + "/do_it_yourself_convts.cpp",
|
bpl_exa + "/do_it_yourself_convts.cpp",
|
||||||
|
bpl_exa + "/nested.cpp",
|
||||||
bpl_exa + "/pickle1.cpp",
|
bpl_exa + "/pickle1.cpp",
|
||||||
bpl_exa + "/pickle2.cpp",
|
bpl_exa + "/pickle2.cpp",
|
||||||
bpl_exa + "/pickle3.cpp",
|
bpl_exa + "/pickle3.cpp",
|
||||||
@@ -32,6 +34,7 @@ bpl_exa + "/test_getting_started1.py",
|
|||||||
bpl_exa + "/test_getting_started2.py",
|
bpl_exa + "/test_getting_started2.py",
|
||||||
bpl_exa + "/test_simple_vector.py",
|
bpl_exa + "/test_simple_vector.py",
|
||||||
bpl_exa + "/test_do_it_yourself_convts.py",
|
bpl_exa + "/test_do_it_yourself_convts.py",
|
||||||
|
bpl_exa + "/test_nested.py",
|
||||||
bpl_exa + "/test_pickle1.py",
|
bpl_exa + "/test_pickle1.py",
|
||||||
bpl_exa + "/test_pickle2.py",
|
bpl_exa + "/test_pickle2.py",
|
||||||
bpl_exa + "/test_pickle3.py",
|
bpl_exa + "/test_pickle3.py",
|
||||||
@@ -68,6 +71,7 @@ defs = (
|
|||||||
"getting_started2",
|
"getting_started2",
|
||||||
"simple_vector",
|
"simple_vector",
|
||||||
"do_it_yourself_convts",
|
"do_it_yourself_convts",
|
||||||
|
"nested",
|
||||||
"pickle1",
|
"pickle1",
|
||||||
"pickle2",
|
"pickle2",
|
||||||
"pickle3",
|
"pickle3",
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ LIBSRC = \
|
|||||||
classes.cpp \
|
classes.cpp \
|
||||||
conversions.cpp \
|
conversions.cpp \
|
||||||
cross_module.cpp \
|
cross_module.cpp \
|
||||||
|
errors.cpp \
|
||||||
extension_class.cpp \
|
extension_class.cpp \
|
||||||
functions.cpp \
|
functions.cpp \
|
||||||
init_function.cpp \
|
init_function.cpp \
|
||||||
|
|||||||
@@ -1,136 +0,0 @@
|
|||||||
# Microsoft Developer Studio Project File - Name="getting_started1" - Package Owner=<4>
|
|
||||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
|
||||||
# ** DO NOT EDIT **
|
|
||||||
|
|
||||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
|
||||||
|
|
||||||
CFG=getting_started1 - Win32 DebugPython
|
|
||||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
|
||||||
!MESSAGE use the Export Makefile command and run
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "getting_started1.mak".
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE You can specify a configuration when running NMAKE
|
|
||||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "getting_started1.mak" CFG="getting_started1 - Win32 DebugPython"
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE Possible choices for configuration are:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE "getting_started1 - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
|
|
||||||
!MESSAGE "getting_started1 - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
|
|
||||||
!MESSAGE "getting_started1 - Win32 DebugPython" (based on "Win32 (x86) Dynamic-Link Library")
|
|
||||||
!MESSAGE
|
|
||||||
|
|
||||||
# Begin Project
|
|
||||||
# PROP AllowPerConfigDependencies 0
|
|
||||||
# PROP Scc_ProjName ""
|
|
||||||
# PROP Scc_LocalPath ""
|
|
||||||
CPP=xicl6.exe
|
|
||||||
MTL=midl.exe
|
|
||||||
RSC=rc.exe
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "getting_started1 - Win32 Release"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 0
|
|
||||||
# PROP BASE Output_Dir "Release"
|
|
||||||
# PROP BASE Intermediate_Dir "Release"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 0
|
|
||||||
# PROP Output_Dir "Release"
|
|
||||||
# PROP Intermediate_Dir "Release"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
|
|
||||||
# ADD CPP /nologo /MD /W3 /GR /GX /O2 /I "..\..\..\.." /I "c:\tools\python\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
|
|
||||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
|
||||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
|
||||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=xilink6.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 /libpath:"c:\tools\python\libs"
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "getting_started1 - Win32 Debug"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "Debug"
|
|
||||||
# PROP BASE Intermediate_Dir "Debug"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "Debug"
|
|
||||||
# PROP Intermediate_Dir "Debug"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c
|
|
||||||
# ADD CPP /nologo /MDd /W3 /GR /GX /ZI /Od /I "..\..\..\.." /I "c:\tools\python\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c
|
|
||||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=xilink6.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept /libpath:"c:\tools\python\libs"
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "getting_started1 - Win32 DebugPython"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "DebugPython"
|
|
||||||
# PROP BASE Intermediate_Dir "DebugPython"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "DebugPython"
|
|
||||||
# PROP Intermediate_Dir "DebugPython"
|
|
||||||
# PROP Ignore_Export_Lib 1
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c
|
|
||||||
# ADD CPP /nologo /MDd /W3 /GR /GX /Zi /Od /I "..\..\..\.." /I "c:\tools\python\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TEST_EXPORTS" /D "BOOST_DEBUG_PYTHON" /YX /FD /GZ /c
|
|
||||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=xilink6.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:no /pdb:"DebugPython/boost_python_test_d.pdb" /debug /machine:I386 /out:"DebugPython/getting_started1_d.dll" /pdbtype:sept /libpath:"c:\tools\python\src\PCbuild"
|
|
||||||
# SUBTRACT LINK32 /pdb:none
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# Begin Target
|
|
||||||
|
|
||||||
# Name "getting_started1 - Win32 Release"
|
|
||||||
# Name "getting_started1 - Win32 Debug"
|
|
||||||
# Name "getting_started1 - Win32 DebugPython"
|
|
||||||
# Begin Group "Source Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\example\getting_started1.cpp
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "Header Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
|
||||||
# End Group
|
|
||||||
# Begin Group "Resource Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
|
||||||
# End Group
|
|
||||||
# End Target
|
|
||||||
# End Project
|
|
||||||
@@ -1,135 +0,0 @@
|
|||||||
# Microsoft Developer Studio Project File - Name="getting_started2" - Package Owner=<4>
|
|
||||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
|
||||||
# ** DO NOT EDIT **
|
|
||||||
|
|
||||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
|
||||||
|
|
||||||
CFG=getting_started2 - Win32 DebugPython
|
|
||||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
|
||||||
!MESSAGE use the Export Makefile command and run
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "getting_started2.mak".
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE You can specify a configuration when running NMAKE
|
|
||||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "getting_started2.mak" CFG="getting_started2 - Win32 DebugPython"
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE Possible choices for configuration are:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE "getting_started2 - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
|
|
||||||
!MESSAGE "getting_started2 - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
|
|
||||||
!MESSAGE "getting_started2 - Win32 DebugPython" (based on "Win32 (x86) Dynamic-Link Library")
|
|
||||||
!MESSAGE
|
|
||||||
|
|
||||||
# Begin Project
|
|
||||||
# PROP AllowPerConfigDependencies 0
|
|
||||||
# PROP Scc_ProjName "getting_started2"
|
|
||||||
# PROP Scc_LocalPath "."
|
|
||||||
CPP=xicl6.exe
|
|
||||||
MTL=midl.exe
|
|
||||||
RSC=rc.exe
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "getting_started2 - Win32 Release"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 0
|
|
||||||
# PROP BASE Output_Dir "Release"
|
|
||||||
# PROP BASE Intermediate_Dir "Release"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 0
|
|
||||||
# PROP Output_Dir "Release"
|
|
||||||
# PROP Intermediate_Dir "Release"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
|
|
||||||
# ADD CPP /nologo /MD /W3 /GR /GX /O2 /I "..\..\..\.." /I "c:\tools\python\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /YX /FD /c
|
|
||||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
|
||||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
|
||||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=xilink6.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /machine:I386 /libpath:"c:\tools\python\libs"
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "getting_started2 - Win32 Debug"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "Debug"
|
|
||||||
# PROP BASE Intermediate_Dir "Debug"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "Debug"
|
|
||||||
# PROP Intermediate_Dir "Debug"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c
|
|
||||||
# ADD CPP /nologo /MDd /W3 /Gm- /GR /GX /Zi /Od /I "..\..\..\.." /I "c:\tools\python\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /FR /YX /FD /GZ /c
|
|
||||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=xilink6.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept /libpath:"c:\tools\python\libs"
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "getting_started2 - Win32 DebugPython"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "getting_started2___Win32_DebugPython"
|
|
||||||
# PROP BASE Intermediate_Dir "getting_started2___Win32_DebugPython"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "getting_started2___Win32_DebugPython"
|
|
||||||
# PROP Intermediate_Dir "getting_started2___Win32_DebugPython"
|
|
||||||
# PROP Ignore_Export_Lib 1
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /YX /FD /GZ /c
|
|
||||||
# ADD CPP /nologo /MDd /W3 /Gm- /GR /GX /Zi /Od /I "..\..\..\.." /I "c:\tools\python\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TEST_EXPORTS" /D "BOOST_DEBUG_PYTHON" /FR /YX /FD /GZ /c
|
|
||||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=xilink6.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /pdbtype:sept
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /subsystem:windows /dll /debug /machine:I386 /out:"DebugPython/getting_started2_d.dll" /pdbtype:sept /libpath:"c:\tools\python\src\pcbuild"
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# Begin Target
|
|
||||||
|
|
||||||
# Name "getting_started2 - Win32 Release"
|
|
||||||
# Name "getting_started2 - Win32 Debug"
|
|
||||||
# Name "getting_started2 - Win32 DebugPython"
|
|
||||||
# Begin Group "Source Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\example\getting_started2.cpp
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "Header Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
|
||||||
# End Group
|
|
||||||
# Begin Group "Resource Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
|
||||||
# End Group
|
|
||||||
# End Target
|
|
||||||
# End Project
|
|
||||||
@@ -17,10 +17,10 @@
|
|||||||
ROOT=$(HOME)
|
ROOT=$(HOME)
|
||||||
BOOST=$(ROOT)/boost
|
BOOST=$(ROOT)/boost
|
||||||
|
|
||||||
PYEXE=/usr/local/Python-1.5.2/bin/python
|
#PYEXE=PYTHONPATH=. /usr/local/Python-1.5.2/bin/python
|
||||||
PYINC=-I/usr/local/Python-1.5.2/include/python1.5
|
#PYINC=-I/usr/local/Python-1.5.2/include/python1.5
|
||||||
#PYEXE=/usr/local/Python-2.1/bin/python
|
PYEXE=PYTHONPATH=. /usr/local_cci/Python-2.1.1/bin/python
|
||||||
#PYINC=-I/usr/local/Python-2.1/include/python2.1
|
PYINC=-I/usr/local_cci/Python-2.1.1/include/python2.1
|
||||||
STLPORTINC=-I$(BOOST)/boost/compatibility/cpp_c_headers
|
STLPORTINC=-I$(BOOST)/boost/compatibility/cpp_c_headers
|
||||||
|
|
||||||
STDOPTS=
|
STDOPTS=
|
||||||
@@ -35,7 +35,7 @@ MAKEDEP=-M
|
|||||||
LD=CC -LANG:std -n32 -mips4
|
LD=CC -LANG:std -n32 -mips4
|
||||||
LDOPTS=-shared
|
LDOPTS=-shared
|
||||||
|
|
||||||
OBJ=classes.o conversions.o extension_class.o functions.o \
|
OBJ=classes.o conversions.o errors.o extension_class.o functions.o \
|
||||||
init_function.o module_builder.o \
|
init_function.o module_builder.o \
|
||||||
objects.o types.o cross_module.o
|
objects.o types.o cross_module.o
|
||||||
DEPOBJ=$(OBJ) \
|
DEPOBJ=$(OBJ) \
|
||||||
@@ -44,6 +44,7 @@ DEPOBJ=$(OBJ) \
|
|||||||
getting_started1.o getting_started2.o \
|
getting_started1.o getting_started2.o \
|
||||||
simple_vector.o \
|
simple_vector.o \
|
||||||
do_it_yourself_convts.o \
|
do_it_yourself_convts.o \
|
||||||
|
nested.o \
|
||||||
pickle1.o pickle2.o pickle3.o \
|
pickle1.o pickle2.o pickle3.o \
|
||||||
noncopyable_export.o noncopyable_import.o \
|
noncopyable_export.o noncopyable_import.o \
|
||||||
ivect.o dvect.o \
|
ivect.o dvect.o \
|
||||||
@@ -57,6 +58,7 @@ all: libboost_python.a \
|
|||||||
getting_started1.so getting_started2.so \
|
getting_started1.so getting_started2.so \
|
||||||
simple_vector.so \
|
simple_vector.so \
|
||||||
do_it_yourself_convts.so \
|
do_it_yourself_convts.so \
|
||||||
|
nested.so \
|
||||||
pickle1.so pickle2.so pickle3.so \
|
pickle1.so pickle2.so pickle3.so \
|
||||||
noncopyable_export.so noncopyable_import.so \
|
noncopyable_export.so noncopyable_import.so \
|
||||||
ivect.so dvect.so \
|
ivect.so dvect.so \
|
||||||
@@ -84,6 +86,9 @@ simple_vector.so: $(OBJ) simple_vector.o
|
|||||||
do_it_yourself_convts.so: $(OBJ) do_it_yourself_convts.o
|
do_it_yourself_convts.so: $(OBJ) do_it_yourself_convts.o
|
||||||
$(LD) $(LDOPTS) $(OBJ) do_it_yourself_convts.o -o do_it_yourself_convts.so
|
$(LD) $(LDOPTS) $(OBJ) do_it_yourself_convts.o -o do_it_yourself_convts.so
|
||||||
|
|
||||||
|
nested.so: $(OBJ) nested.o
|
||||||
|
$(LD) $(LDOPTS) $(OBJ) nested.o -o nested.so
|
||||||
|
|
||||||
pickle1.so: $(OBJ) pickle1.o
|
pickle1.so: $(OBJ) pickle1.o
|
||||||
$(LD) $(LDOPTS) $(OBJ) pickle1.o -o pickle1.so
|
$(LD) $(LDOPTS) $(OBJ) pickle1.o -o pickle1.so
|
||||||
|
|
||||||
@@ -126,6 +131,7 @@ test:
|
|||||||
$(PYEXE) test_getting_started2.py
|
$(PYEXE) test_getting_started2.py
|
||||||
$(PYEXE) test_simple_vector.py
|
$(PYEXE) test_simple_vector.py
|
||||||
$(PYEXE) test_do_it_yourself_convts.py
|
$(PYEXE) test_do_it_yourself_convts.py
|
||||||
|
$(PYEXE) test_nested.py
|
||||||
$(PYEXE) test_pickle1.py
|
$(PYEXE) test_pickle1.py
|
||||||
$(PYEXE) test_pickle2.py
|
$(PYEXE) test_pickle2.py
|
||||||
$(PYEXE) test_pickle3.py
|
$(PYEXE) test_pickle3.py
|
||||||
@@ -142,6 +148,7 @@ clean:
|
|||||||
rm -f getting_started2.o getting_started2.so
|
rm -f getting_started2.o getting_started2.so
|
||||||
rm -f simple_vector.o simple_vector.so
|
rm -f simple_vector.o simple_vector.so
|
||||||
rm -f do_it_yourself_convts.o do_it_yourself_convts.so
|
rm -f do_it_yourself_convts.o do_it_yourself_convts.so
|
||||||
|
rm -f nested.o nested.so
|
||||||
rm -f pickle1.o pickle1.so
|
rm -f pickle1.o pickle1.so
|
||||||
rm -f pickle2.o pickle2.so
|
rm -f pickle2.o pickle2.so
|
||||||
rm -f pickle3.o pickle3.so
|
rm -f pickle3.o pickle3.so
|
||||||
|
|||||||
@@ -17,12 +17,12 @@
|
|||||||
ROOT=$(HOME)
|
ROOT=$(HOME)
|
||||||
BOOST=$(ROOT)/boost
|
BOOST=$(ROOT)/boost
|
||||||
|
|
||||||
PYEXE=PYTHONPATH=. /usr/bin/python
|
#PYEXE=PYTHONPATH=. /usr/bin/python
|
||||||
PYINC=-I/usr/include/python1.5
|
#PYINC=-I/usr/include/python1.5
|
||||||
#PYEXE=/usr/local/Python-1.5.2/bin/python
|
#PYEXE=PYTHONPATH=. /usr/local/Python-1.5.2/bin/python
|
||||||
#PYINC=-I/usr/local/Python-1.5.2/include/python1.5
|
#PYINC=-I/usr/local/Python-1.5.2/include/python1.5
|
||||||
#PYEXE=/usr/local/Python-2.1/bin/python
|
PYEXE=PYTHONPATH=. /usr/local_cci/Python-2.1.1/bin/python
|
||||||
#PYINC=-I/usr/local/Python-2.1/include/python2.1
|
PYINC=-I/usr/local_cci/Python-2.1.1/include/python2.1
|
||||||
|
|
||||||
STDOPTS=-fPIC -ftemplate-depth-21
|
STDOPTS=-fPIC -ftemplate-depth-21
|
||||||
WARNOPTS=
|
WARNOPTS=
|
||||||
@@ -36,7 +36,7 @@ MAKEDEP=-M
|
|||||||
LD=$(CPP)
|
LD=$(CPP)
|
||||||
LDOPTS=-shared
|
LDOPTS=-shared
|
||||||
|
|
||||||
OBJ=classes.o conversions.o extension_class.o functions.o \
|
OBJ=classes.o conversions.o errors.o extension_class.o functions.o \
|
||||||
init_function.o module_builder.o \
|
init_function.o module_builder.o \
|
||||||
objects.o types.o cross_module.o
|
objects.o types.o cross_module.o
|
||||||
DEPOBJ=$(OBJ) \
|
DEPOBJ=$(OBJ) \
|
||||||
@@ -45,6 +45,7 @@ DEPOBJ=$(OBJ) \
|
|||||||
getting_started1.o getting_started2.o \
|
getting_started1.o getting_started2.o \
|
||||||
simple_vector.o \
|
simple_vector.o \
|
||||||
do_it_yourself_convts.o \
|
do_it_yourself_convts.o \
|
||||||
|
nested.o \
|
||||||
pickle1.o pickle2.o pickle3.o \
|
pickle1.o pickle2.o pickle3.o \
|
||||||
noncopyable_export.o noncopyable_import.o \
|
noncopyable_export.o noncopyable_import.o \
|
||||||
ivect.o dvect.o \
|
ivect.o dvect.o \
|
||||||
@@ -58,6 +59,7 @@ all: libboost_python.a \
|
|||||||
getting_started1.so getting_started2.so \
|
getting_started1.so getting_started2.so \
|
||||||
simple_vector.so \
|
simple_vector.so \
|
||||||
do_it_yourself_convts.so \
|
do_it_yourself_convts.so \
|
||||||
|
nested.so \
|
||||||
pickle1.so pickle2.so pickle3.so \
|
pickle1.so pickle2.so pickle3.so \
|
||||||
noncopyable_export.so noncopyable_import.so \
|
noncopyable_export.so noncopyable_import.so \
|
||||||
ivect.so dvect.so \
|
ivect.so dvect.so \
|
||||||
@@ -85,6 +87,9 @@ simple_vector.so: $(OBJ) simple_vector.o
|
|||||||
do_it_yourself_convts.so: $(OBJ) do_it_yourself_convts.o
|
do_it_yourself_convts.so: $(OBJ) do_it_yourself_convts.o
|
||||||
$(LD) $(LDOPTS) $(OBJ) do_it_yourself_convts.o -o do_it_yourself_convts.so
|
$(LD) $(LDOPTS) $(OBJ) do_it_yourself_convts.o -o do_it_yourself_convts.so
|
||||||
|
|
||||||
|
nested.so: $(OBJ) nested.o
|
||||||
|
$(LD) $(LDOPTS) $(OBJ) nested.o -o nested.so
|
||||||
|
|
||||||
pickle1.so: $(OBJ) pickle1.o
|
pickle1.so: $(OBJ) pickle1.o
|
||||||
$(LD) $(LDOPTS) $(OBJ) pickle1.o -o pickle1.so
|
$(LD) $(LDOPTS) $(OBJ) pickle1.o -o pickle1.so
|
||||||
|
|
||||||
@@ -127,6 +132,7 @@ test:
|
|||||||
$(PYEXE) test_getting_started2.py
|
$(PYEXE) test_getting_started2.py
|
||||||
$(PYEXE) test_simple_vector.py
|
$(PYEXE) test_simple_vector.py
|
||||||
$(PYEXE) test_do_it_yourself_convts.py
|
$(PYEXE) test_do_it_yourself_convts.py
|
||||||
|
$(PYEXE) test_nested.py
|
||||||
$(PYEXE) test_pickle1.py
|
$(PYEXE) test_pickle1.py
|
||||||
$(PYEXE) test_pickle2.py
|
$(PYEXE) test_pickle2.py
|
||||||
$(PYEXE) test_pickle3.py
|
$(PYEXE) test_pickle3.py
|
||||||
@@ -143,6 +149,7 @@ clean:
|
|||||||
rm -f getting_started2.o getting_started2.so
|
rm -f getting_started2.o getting_started2.so
|
||||||
rm -f simple_vector.o simple_vector.so
|
rm -f simple_vector.o simple_vector.so
|
||||||
rm -f do_it_yourself_convts.o do_it_yourself_convts.so
|
rm -f do_it_yourself_convts.o do_it_yourself_convts.so
|
||||||
|
rm -f nested.o nested.so
|
||||||
rm -f pickle1.o pickle1.so
|
rm -f pickle1.o pickle1.so
|
||||||
rm -f pickle2.o pickle2.so
|
rm -f pickle2.o pickle2.so
|
||||||
rm -f pickle3.o pickle3.so
|
rm -f pickle3.o pickle3.so
|
||||||
|
|||||||
@@ -30,13 +30,16 @@
|
|||||||
# -fvtable-thunks eliminates the compiler warning, but
|
# -fvtable-thunks eliminates the compiler warning, but
|
||||||
# "import boost_python_test" still causes a crash.
|
# "import boost_python_test" still causes a crash.
|
||||||
|
|
||||||
ROOT=L:
|
ROOT=R:
|
||||||
BOOST_WIN="$(ROOT)\boost"
|
BOOST_WIN="$(ROOT)\boost"
|
||||||
BOOST_UNIX=$(HOME)/boost
|
BOOST_UNIX=$(HOME)/boost
|
||||||
|
|
||||||
PYEXE="C:\Program files\Python\python.exe"
|
PYEXE="C:\Program files\Python\python.exe"
|
||||||
PYINC=-I"C:\usr\include\python1.5"
|
PYINC=-I"C:\usr\include\python1.5"
|
||||||
PYLIB="C:\usr\lib\libpython15.a"
|
PYLIB="C:\usr\lib\libpython15.a"
|
||||||
|
#PYEXE="C:\Python21\python.exe"
|
||||||
|
#PYINC=-I"C:\usr\include\python2.1"
|
||||||
|
#PYLIB="C:\usr\lib\libpython21.a"
|
||||||
|
|
||||||
STDOPTS=-ftemplate-depth-21
|
STDOPTS=-ftemplate-depth-21
|
||||||
WARNOPTS=
|
WARNOPTS=
|
||||||
@@ -49,7 +52,7 @@ CPPOPTS=$(STLPORTINC) $(STLPORTOPTS) -I$(BOOST_WIN) $(PYINC) \
|
|||||||
LD=g++
|
LD=g++
|
||||||
LDOPTS=-shared
|
LDOPTS=-shared
|
||||||
|
|
||||||
OBJ=classes.o conversions.o extension_class.o functions.o \
|
OBJ=classes.o conversions.o errors.o extension_class.o functions.o \
|
||||||
init_function.o module_builder.o \
|
init_function.o module_builder.o \
|
||||||
objects.o types.o cross_module.o
|
objects.o types.o cross_module.o
|
||||||
|
|
||||||
@@ -60,6 +63,7 @@ all: libboost_python.a \
|
|||||||
getting_started1.pyd getting_started2.pyd \
|
getting_started1.pyd getting_started2.pyd \
|
||||||
simple_vector.pyd \
|
simple_vector.pyd \
|
||||||
do_it_yourself_convts.pyd \
|
do_it_yourself_convts.pyd \
|
||||||
|
nested.pyd \
|
||||||
pickle1.pyd pickle2.pyd pickle3.pyd \
|
pickle1.pyd pickle2.pyd pickle3.pyd \
|
||||||
noncopyable_export.pyd noncopyable_import.pyd \
|
noncopyable_export.pyd noncopyable_import.pyd \
|
||||||
ivect.pyd dvect.pyd \
|
ivect.pyd dvect.pyd \
|
||||||
@@ -108,6 +112,12 @@ do_it_yourself_convts.pyd: $(OBJ) do_it_yourself_convts.o
|
|||||||
--def do_it_yourself_convts.def \
|
--def do_it_yourself_convts.def \
|
||||||
$(OBJ) do_it_yourself_convts.o $(PYLIB)
|
$(OBJ) do_it_yourself_convts.o $(PYLIB)
|
||||||
|
|
||||||
|
nested.pyd: $(OBJ) nested.o
|
||||||
|
dllwrap $(DLLWRAPOPTS) \
|
||||||
|
--dllname nested.pyd \
|
||||||
|
--def nested.def \
|
||||||
|
$(OBJ) nested.o $(PYLIB)
|
||||||
|
|
||||||
pickle1.pyd: $(OBJ) pickle1.o
|
pickle1.pyd: $(OBJ) pickle1.o
|
||||||
dllwrap $(DLLWRAPOPTS) \
|
dllwrap $(DLLWRAPOPTS) \
|
||||||
--dllname pickle1.pyd \
|
--dllname pickle1.pyd \
|
||||||
@@ -178,6 +188,7 @@ test:
|
|||||||
$(PYEXE) test_getting_started2.py
|
$(PYEXE) test_getting_started2.py
|
||||||
$(PYEXE) test_simple_vector.py
|
$(PYEXE) test_simple_vector.py
|
||||||
$(PYEXE) test_do_it_yourself_convts.py
|
$(PYEXE) test_do_it_yourself_convts.py
|
||||||
|
$(PYEXE) test_nested.py
|
||||||
$(PYEXE) test_pickle1.py
|
$(PYEXE) test_pickle1.py
|
||||||
$(PYEXE) test_pickle2.py
|
$(PYEXE) test_pickle2.py
|
||||||
$(PYEXE) test_pickle3.py
|
$(PYEXE) test_pickle3.py
|
||||||
|
|||||||
@@ -1,135 +0,0 @@
|
|||||||
# Microsoft Developer Studio Project File - Name="rwgk1" - Package Owner=<4>
|
|
||||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
|
||||||
# ** DO NOT EDIT **
|
|
||||||
|
|
||||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
|
||||||
|
|
||||||
CFG=rwgk1 - Win32 DebugPython
|
|
||||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
|
||||||
!MESSAGE use the Export Makefile command and run
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "rwgk1.mak".
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE You can specify a configuration when running NMAKE
|
|
||||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "rwgk1.mak" CFG="rwgk1 - Win32 DebugPython"
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE Possible choices for configuration are:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE "rwgk1 - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
|
|
||||||
!MESSAGE "rwgk1 - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
|
|
||||||
!MESSAGE "rwgk1 - Win32 DebugPython" (based on "Win32 (x86) Dynamic-Link Library")
|
|
||||||
!MESSAGE
|
|
||||||
|
|
||||||
# Begin Project
|
|
||||||
# PROP AllowPerConfigDependencies 0
|
|
||||||
# PROP Scc_ProjName ""
|
|
||||||
# PROP Scc_LocalPath ""
|
|
||||||
CPP=cl.exe
|
|
||||||
MTL=midl.exe
|
|
||||||
RSC=rc.exe
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "rwgk1 - Win32 Release"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 0
|
|
||||||
# PROP BASE Output_Dir "Release"
|
|
||||||
# PROP BASE Intermediate_Dir "Release"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 0
|
|
||||||
# PROP Output_Dir "Release"
|
|
||||||
# PROP Intermediate_Dir "Release"
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "RWGK1_EXPORTS" /YX /FD /c
|
|
||||||
# ADD CPP /nologo /MD /W3 /GX /O2 /I "..\..\..\.." /I "c:\tools\python\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "RWGK1_EXPORTS" /YX /FD /c
|
|
||||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
|
||||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
|
||||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /libpath:"c:\tools\python\libs"
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "rwgk1 - Win32 Debug"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "Debug"
|
|
||||||
# PROP BASE Intermediate_Dir "Debug"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "Debug"
|
|
||||||
# PROP Intermediate_Dir "Debug"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "RWGK1_EXPORTS" /YX /FD /GZ /c
|
|
||||||
# ADD CPP /nologo /MDd /W3 /Gm- /GX /Zi /Od /I "..\..\..\.." /I "c:\tools\python\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "RWGK1_EXPORTS" /YX /FD /GZ /c
|
|
||||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:no /debug /machine:I386 /pdbtype:sept /libpath:"c:\tools\python\libs"
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "rwgk1 - Win32 DebugPython"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "rwgk1___Win32_DebugPython"
|
|
||||||
# PROP BASE Intermediate_Dir "rwgk1___Win32_DebugPython"
|
|
||||||
# PROP BASE Ignore_Export_Lib 0
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "DebugPython"
|
|
||||||
# PROP Intermediate_Dir "DebugPython"
|
|
||||||
# PROP Ignore_Export_Lib 1
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MDd /W3 /Gm /GX /Zi /Od /I "..\..\..\.." /I "c:\tools\python\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "RWGK1_EXPORTS" /YX /FD /GZ /c
|
|
||||||
# ADD CPP /nologo /MDd /W3 /Gm- /GX /Zi /Od /I "..\..\..\.." /I "c:\tools\python\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "RWGK1_EXPORTS" /D "BOOST_DEBUG_PYTHON" /YX /FD /GZ /c
|
|
||||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:no /debug /machine:I386 /pdbtype:sept /libpath:"c:\tools\python\libs"
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"DebugPython/rwgk1_d.dll" /pdbtype:sept /libpath:"C:\tools\python\src\PCbuild"
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# Begin Target
|
|
||||||
|
|
||||||
# Name "rwgk1 - Win32 Release"
|
|
||||||
# Name "rwgk1 - Win32 Debug"
|
|
||||||
# Name "rwgk1 - Win32 DebugPython"
|
|
||||||
# Begin Group "Source Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\example\rwgk1.cpp
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "Header Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
|
||||||
# End Group
|
|
||||||
# Begin Group "Resource Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
|
||||||
# End Group
|
|
||||||
# End Target
|
|
||||||
# End Project
|
|
||||||
@@ -1,145 +0,0 @@
|
|||||||
# Microsoft Developer Studio Project File - Name="test" - Package Owner=<4>
|
|
||||||
# Microsoft Developer Studio Generated Build File, Format Version 6.00
|
|
||||||
# ** DO NOT EDIT **
|
|
||||||
|
|
||||||
# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102
|
|
||||||
|
|
||||||
CFG=test - Win32 DebugPython
|
|
||||||
!MESSAGE This is not a valid makefile. To build this project using NMAKE,
|
|
||||||
!MESSAGE use the Export Makefile command and run
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "test.mak".
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE You can specify a configuration when running NMAKE
|
|
||||||
!MESSAGE by defining the macro CFG on the command line. For example:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE NMAKE /f "test.mak" CFG="test - Win32 DebugPython"
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE Possible choices for configuration are:
|
|
||||||
!MESSAGE
|
|
||||||
!MESSAGE "test - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library")
|
|
||||||
!MESSAGE "test - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library")
|
|
||||||
!MESSAGE "test - Win32 DebugPython" (based on "Win32 (x86) Dynamic-Link Library")
|
|
||||||
!MESSAGE
|
|
||||||
|
|
||||||
# Begin Project
|
|
||||||
# PROP AllowPerConfigDependencies 0
|
|
||||||
# PROP Scc_ProjName ""
|
|
||||||
# PROP Scc_LocalPath ""
|
|
||||||
CPP=cl.exe
|
|
||||||
MTL=midl.exe
|
|
||||||
RSC=rc.exe
|
|
||||||
|
|
||||||
!IF "$(CFG)" == "test - Win32 Release"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 0
|
|
||||||
# PROP BASE Output_Dir "Release"
|
|
||||||
# PROP BASE Intermediate_Dir "Release"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 0
|
|
||||||
# PROP Output_Dir "Release"
|
|
||||||
# PROP Intermediate_Dir "Release"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TEST_EXPORTS" /YX /FD /c
|
|
||||||
# ADD CPP /nologo /MD /W3 /GR /GX /O2 /I "..\..\..\.." /I "c:\tools\python\include" /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TEST_EXPORTS" /YX /FD /Zm200 /c
|
|
||||||
# SUBTRACT CPP /Fr
|
|
||||||
# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
|
||||||
# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32
|
|
||||||
# ADD BASE RSC /l 0x409 /d "NDEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "NDEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 /out:"Release/boost_python_test.dll" /libpath:"c:\tools\python\libs"
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "test - Win32 Debug"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "Debug"
|
|
||||||
# PROP BASE Intermediate_Dir "Debug"
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "Debug"
|
|
||||||
# PROP Intermediate_Dir "Debug"
|
|
||||||
# PROP Ignore_Export_Lib 0
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TEST_EXPORTS" /YX /FD /GZ /c
|
|
||||||
# ADD CPP /nologo /MDd /W3 /Gm- /GR /GX /Zi /Od /I "..\..\..\.." /I "c:\tools\python\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TEST_EXPORTS" /YX /FD /GZ /Zm200 /c
|
|
||||||
# SUBTRACT CPP /Fr
|
|
||||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"Debug/boost_python_test.dll" /pdbtype:sept /libpath:"c:\tools\python\libs"
|
|
||||||
# SUBTRACT LINK32 /pdb:none
|
|
||||||
|
|
||||||
!ELSEIF "$(CFG)" == "test - Win32 DebugPython"
|
|
||||||
|
|
||||||
# PROP BASE Use_MFC 0
|
|
||||||
# PROP BASE Use_Debug_Libraries 1
|
|
||||||
# PROP BASE Output_Dir "test___Win32_DebugPython"
|
|
||||||
# PROP BASE Intermediate_Dir "test___Win32_DebugPython"
|
|
||||||
# PROP BASE Ignore_Export_Lib 0
|
|
||||||
# PROP BASE Target_Dir ""
|
|
||||||
# PROP Use_MFC 0
|
|
||||||
# PROP Use_Debug_Libraries 1
|
|
||||||
# PROP Output_Dir "DebugPython"
|
|
||||||
# PROP Intermediate_Dir "DebugPython"
|
|
||||||
# PROP Ignore_Export_Lib 1
|
|
||||||
# PROP Target_Dir ""
|
|
||||||
# ADD BASE CPP /nologo /MDd /W3 /Gm /GR /GX /Zi /Od /I "..\..\..\.." /I "c:\tools\python\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TEST_EXPORTS" /YX /FD /GZ /Zm200 /c
|
|
||||||
# ADD CPP /nologo /MDd /W3 /Gm- /GR /GX /Zi /Od /I "..\..\..\.." /I "c:\tools\python\include" /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "TEST_EXPORTS" /D "BOOST_DEBUG_PYTHON" /YX /FD /GZ /Zm200 /EHs /c
|
|
||||||
# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32
|
|
||||||
# ADD BASE RSC /l 0x409 /d "_DEBUG"
|
|
||||||
# ADD RSC /l 0x409 /d "_DEBUG"
|
|
||||||
BSC32=bscmake.exe
|
|
||||||
# ADD BASE BSC32 /nologo
|
|
||||||
# ADD BSC32 /nologo
|
|
||||||
LINK32=link.exe
|
|
||||||
# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:no /debug /machine:I386 /pdbtype:sept /libpath:"c:\tools\python\libs"
|
|
||||||
# SUBTRACT BASE LINK32 /pdb:none
|
|
||||||
# ADD LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /incremental:no /debug /machine:I386 /out:"DebugPython/boost_python_test_d.dll" /pdbtype:sept /libpath:"c:\tools\python\src\PCbuild"
|
|
||||||
# SUBTRACT LINK32 /pdb:none
|
|
||||||
|
|
||||||
!ENDIF
|
|
||||||
|
|
||||||
# Begin Target
|
|
||||||
|
|
||||||
# Name "test - Win32 Release"
|
|
||||||
# Name "test - Win32 Debug"
|
|
||||||
# Name "test - Win32 DebugPython"
|
|
||||||
# Begin Group "Source Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "cpp;c;cxx;rc;def;r;odl;idl;hpj;bat"
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\test\comprehensive.cpp
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "Header Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "h;hpp;hxx;hm;inl"
|
|
||||||
# Begin Source File
|
|
||||||
|
|
||||||
SOURCE=..\..\test\comprehensive.hpp
|
|
||||||
# End Source File
|
|
||||||
# End Group
|
|
||||||
# Begin Group "Resource Files"
|
|
||||||
|
|
||||||
# PROP Default_Filter "ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe"
|
|
||||||
# End Group
|
|
||||||
# End Target
|
|
||||||
# End Project
|
|
||||||
@@ -17,10 +17,10 @@
|
|||||||
ROOT=$(HOME)
|
ROOT=$(HOME)
|
||||||
BOOST=$(ROOT)/boost
|
BOOST=$(ROOT)/boost
|
||||||
|
|
||||||
PYEXE=/usr/local/Python-1.5.2/bin/python
|
#PYEXE=PYTHONPATH=. /usr/local/Python-1.5.2/bin/python
|
||||||
PYINC=-I/usr/local/Python-1.5.2/include/python1.5
|
#PYINC=-I/usr/local/Python-1.5.2/include/python1.5
|
||||||
#PYEXE=/usr/local/Python-2.1/bin/python
|
PYEXE=PYTHONPATH=. /usr/local_cci/Python-2.1.1/bin/python
|
||||||
#PYINC=-I/usr/local/Python-2.1/include/python2.1
|
PYINC=-I/usr/local_cci/Python-2.1.1/include/python2.1
|
||||||
#STLPORTINC=-I/usr/local/STLport-4.1b3/stlport
|
#STLPORTINC=-I/usr/local/STLport-4.1b3/stlport
|
||||||
#STLPORTINC=-I/usr/local/STLport-4.1b4/stlport
|
#STLPORTINC=-I/usr/local/STLport-4.1b4/stlport
|
||||||
#STLPORTOPTS= \
|
#STLPORTOPTS= \
|
||||||
@@ -46,7 +46,7 @@ LDOPTS=-shared -expect_unresolved 'Py*' -expect_unresolved '_Py*'
|
|||||||
|
|
||||||
#HIDDEN=-hidden
|
#HIDDEN=-hidden
|
||||||
|
|
||||||
OBJ=classes.o conversions.o extension_class.o functions.o \
|
OBJ=classes.o conversions.o errors.o extension_class.o functions.o \
|
||||||
init_function.o module_builder.o \
|
init_function.o module_builder.o \
|
||||||
objects.o types.o cross_module.o
|
objects.o types.o cross_module.o
|
||||||
DEPOBJ=$(OBJ) \
|
DEPOBJ=$(OBJ) \
|
||||||
@@ -55,6 +55,7 @@ DEPOBJ=$(OBJ) \
|
|||||||
getting_started1.o getting_started2.o \
|
getting_started1.o getting_started2.o \
|
||||||
simple_vector.o \
|
simple_vector.o \
|
||||||
do_it_yourself_convts.o \
|
do_it_yourself_convts.o \
|
||||||
|
nested.o \
|
||||||
pickle1.o pickle2.o pickle3.o \
|
pickle1.o pickle2.o pickle3.o \
|
||||||
noncopyable_export.o noncopyable_import.o \
|
noncopyable_export.o noncopyable_import.o \
|
||||||
ivect.o dvect.o \
|
ivect.o dvect.o \
|
||||||
@@ -68,6 +69,7 @@ all: libboost_python.a \
|
|||||||
getting_started1.so getting_started2.so \
|
getting_started1.so getting_started2.so \
|
||||||
simple_vector.so \
|
simple_vector.so \
|
||||||
do_it_yourself_convts.so \
|
do_it_yourself_convts.so \
|
||||||
|
nested.so \
|
||||||
pickle1.so pickle2.so pickle3.so \
|
pickle1.so pickle2.so pickle3.so \
|
||||||
noncopyable_export.so noncopyable_import.so \
|
noncopyable_export.so noncopyable_import.so \
|
||||||
ivect.so dvect.so \
|
ivect.so dvect.so \
|
||||||
@@ -99,6 +101,9 @@ simple_vector.so: $(OBJ) simple_vector.o
|
|||||||
do_it_yourself_convts.so: $(OBJ) do_it_yourself_convts.o
|
do_it_yourself_convts.so: $(OBJ) do_it_yourself_convts.o
|
||||||
$(LD) $(LDOPTS) $(OBJ) do_it_yourself_convts.o -o do_it_yourself_convts.so
|
$(LD) $(LDOPTS) $(OBJ) do_it_yourself_convts.o -o do_it_yourself_convts.so
|
||||||
|
|
||||||
|
nested.so: $(OBJ) nested.o
|
||||||
|
$(LD) $(LDOPTS) $(OBJ) nested.o -o nested.so
|
||||||
|
|
||||||
pickle1.so: $(OBJ) pickle1.o
|
pickle1.so: $(OBJ) pickle1.o
|
||||||
$(LD) $(LDOPTS) $(OBJ) pickle1.o -o pickle1.so
|
$(LD) $(LDOPTS) $(OBJ) pickle1.o -o pickle1.so
|
||||||
|
|
||||||
@@ -141,6 +146,7 @@ test:
|
|||||||
$(PYEXE) test_getting_started2.py
|
$(PYEXE) test_getting_started2.py
|
||||||
$(PYEXE) test_simple_vector.py
|
$(PYEXE) test_simple_vector.py
|
||||||
$(PYEXE) test_do_it_yourself_convts.py
|
$(PYEXE) test_do_it_yourself_convts.py
|
||||||
|
$(PYEXE) test_nested.py
|
||||||
$(PYEXE) test_pickle1.py
|
$(PYEXE) test_pickle1.py
|
||||||
$(PYEXE) test_pickle2.py
|
$(PYEXE) test_pickle2.py
|
||||||
$(PYEXE) test_pickle3.py
|
$(PYEXE) test_pickle3.py
|
||||||
@@ -157,6 +163,7 @@ clean:
|
|||||||
rm -f getting_started2.o getting_started2.so
|
rm -f getting_started2.o getting_started2.so
|
||||||
rm -f simple_vector.o simple_vector.so
|
rm -f simple_vector.o simple_vector.so
|
||||||
rm -f do_it_yourself_convts.o do_it_yourself_convts.so
|
rm -f do_it_yourself_convts.o do_it_yourself_convts.so
|
||||||
|
rm -f nested.o nested.so
|
||||||
rm -f pickle1.o pickle1.so
|
rm -f pickle1.o pickle1.so
|
||||||
rm -f pickle2.o pickle2.so
|
rm -f pickle2.o pickle2.so
|
||||||
rm -f pickle3.o pickle3.so
|
rm -f pickle3.o pickle3.so
|
||||||
|
|||||||
@@ -1,5 +1,9 @@
|
|||||||
# Usage:
|
# Usage:
|
||||||
#
|
#
|
||||||
|
# Create a new empty directory anywhere (preferably not in the boost tree).
|
||||||
|
# Copy this Makefile to that new directory and rename it to "Makefile"
|
||||||
|
# Adjust the pathnames below.
|
||||||
|
#
|
||||||
# make copy Copy the sources and tests
|
# make copy Copy the sources and tests
|
||||||
# make Compile all sources
|
# make Compile all sources
|
||||||
# make test Run doctest tests
|
# make test Run doctest tests
|
||||||
@@ -10,18 +14,18 @@
|
|||||||
# 12 Apr 01 new macro ROOT to simplify configuration (R.W. Grosse-Kunstleve)
|
# 12 Apr 01 new macro ROOT to simplify configuration (R.W. Grosse-Kunstleve)
|
||||||
# Initial version: R.W. Grosse-Kunstleve
|
# Initial version: R.W. Grosse-Kunstleve
|
||||||
|
|
||||||
ROOT=L:
|
ROOT=R:
|
||||||
BOOST_WIN="$(ROOT)\boost"
|
BOOST_WIN="$(ROOT)\boost"
|
||||||
BOOST_UNIX=$(HOME)/boost
|
BOOST_UNIX=$(HOME)/boost
|
||||||
|
|
||||||
PYEXE="C:\Program files\Python\python.exe"
|
#PYEXE="C:\Program files\Python\python.exe"
|
||||||
PYINC=/I"C:\Program files\Python\include"
|
#PYINC=/I"C:\Program files\Python\include"
|
||||||
PYLIB="C:\Program files\Python\libs\python15.lib"
|
#PYLIB="C:\Program files\Python\libs\python15.lib"
|
||||||
#PYEXE="C:\Python21\python.exe"
|
PYEXE="C:\Python21\python.exe"
|
||||||
#PYINC=/I"C:\Python21\include"
|
PYINC=/I"C:\Python21\include"
|
||||||
#PYLIB="C:\Python21\libs\python21.lib"
|
PYLIB="C:\Python21\libs\python21.lib"
|
||||||
|
|
||||||
STDOPTS=/nologo /MD /GR /GX /Zm200
|
STDOPTS=/nologo /MD /GR /GX /Zm300 /DBOOST_PYTHON_STATIC_LIB
|
||||||
WARNOPTS=
|
WARNOPTS=
|
||||||
OPTOPTS=
|
OPTOPTS=
|
||||||
|
|
||||||
@@ -32,7 +36,7 @@ CPPOPTS=$(STLPORTINC) $(STLPORTOPTS) /I$(BOOST_WIN) $(PYINC) \
|
|||||||
LD=link.exe
|
LD=link.exe
|
||||||
LDOPTS=/nologo /dll /incremental:no
|
LDOPTS=/nologo /dll /incremental:no
|
||||||
|
|
||||||
OBJ=classes.obj conversions.obj extension_class.obj functions.obj \
|
OBJ=classes.obj conversions.obj errors.obj extension_class.obj functions.obj \
|
||||||
init_function.obj module_builder.obj \
|
init_function.obj module_builder.obj \
|
||||||
objects.obj types.obj cross_module.obj
|
objects.obj types.obj cross_module.obj
|
||||||
|
|
||||||
@@ -44,6 +48,7 @@ all: boost_python.lib \
|
|||||||
getting_started1.pyd getting_started2.pyd \
|
getting_started1.pyd getting_started2.pyd \
|
||||||
simple_vector.pyd \
|
simple_vector.pyd \
|
||||||
do_it_yourself_convts.pyd \
|
do_it_yourself_convts.pyd \
|
||||||
|
nested.pyd \
|
||||||
pickle1.pyd pickle2.pyd pickle3.pyd \
|
pickle1.pyd pickle2.pyd pickle3.pyd \
|
||||||
noncopyable_export.pyd noncopyable_import.pyd \
|
noncopyable_export.pyd noncopyable_import.pyd \
|
||||||
ivect.pyd dvect.pyd \
|
ivect.pyd dvect.pyd \
|
||||||
@@ -70,6 +75,9 @@ simple_vector.pyd: $(OBJ) simple_vector.obj
|
|||||||
do_it_yourself_convts.pyd: $(OBJ) do_it_yourself_convts.obj
|
do_it_yourself_convts.pyd: $(OBJ) do_it_yourself_convts.obj
|
||||||
$(LD) $(LDOPTS) $(OBJ) do_it_yourself_convts.obj $(PYLIB) /export:initdo_it_yourself_convts /out:"do_it_yourself_convts.pyd"
|
$(LD) $(LDOPTS) $(OBJ) do_it_yourself_convts.obj $(PYLIB) /export:initdo_it_yourself_convts /out:"do_it_yourself_convts.pyd"
|
||||||
|
|
||||||
|
nested.pyd: $(OBJ) nested.obj
|
||||||
|
$(LD) $(LDOPTS) $(OBJ) nested.obj $(PYLIB) /export:initnested /out:"nested.pyd"
|
||||||
|
|
||||||
pickle1.pyd: $(OBJ) pickle1.obj
|
pickle1.pyd: $(OBJ) pickle1.obj
|
||||||
$(LD) $(LDOPTS) $(OBJ) pickle1.obj $(PYLIB) /export:initpickle1 /out:"pickle1.pyd"
|
$(LD) $(LDOPTS) $(OBJ) pickle1.obj $(PYLIB) /export:initpickle1 /out:"pickle1.pyd"
|
||||||
|
|
||||||
@@ -110,6 +118,7 @@ test:
|
|||||||
$(PYEXE) test_getting_started2.py
|
$(PYEXE) test_getting_started2.py
|
||||||
$(PYEXE) test_simple_vector.py
|
$(PYEXE) test_simple_vector.py
|
||||||
$(PYEXE) test_do_it_yourself_convts.py
|
$(PYEXE) test_do_it_yourself_convts.py
|
||||||
|
$(PYEXE) test_nested.py
|
||||||
$(PYEXE) test_pickle1.py
|
$(PYEXE) test_pickle1.py
|
||||||
$(PYEXE) test_pickle2.py
|
$(PYEXE) test_pickle2.py
|
||||||
$(PYEXE) test_pickle3.py
|
$(PYEXE) test_pickle3.py
|
||||||
|
|||||||
149
build/win32_mwcc.mak
Executable file
149
build/win32_mwcc.mak
Executable file
@@ -0,0 +1,149 @@
|
|||||||
|
# Usage:
|
||||||
|
#
|
||||||
|
# make copy Copy the sources and tests
|
||||||
|
# make Compile all sources
|
||||||
|
# make test Run doctest tests
|
||||||
|
# make clean Remove all object files
|
||||||
|
# make del Remove the sources and tests
|
||||||
|
#
|
||||||
|
# Revision history:
|
||||||
|
# 14 Dec 01 derived from vc60.mak (R.W. Grosse-Kunstleve)
|
||||||
|
|
||||||
|
ROOT=R:
|
||||||
|
BOOST_WIN="$(ROOT)\boost"
|
||||||
|
BOOST_UNIX=$(HOME)/boost
|
||||||
|
|
||||||
|
#PYEXE="C:\Program files\Python\python.exe"
|
||||||
|
#PYINC=-I"C:\Program files\Python\include"
|
||||||
|
#PYLIB="C:\Program files\Python\libs\python15.lib"
|
||||||
|
PYEXE="C:\Python21\python.exe"
|
||||||
|
PYINC=-I"C:\Python21\include"
|
||||||
|
PYLIB="C:\Python21\libs\python21.lib"
|
||||||
|
|
||||||
|
STDOPTS=-gccinc -prefix UseDLLPrefix.h -DBOOST_PYTHON_STATIC_LIB
|
||||||
|
WARNOPTS=-warn on,nounusedexpr,nounused
|
||||||
|
OPTOPTS=-O
|
||||||
|
|
||||||
|
CPP=mwcc
|
||||||
|
CPPOPTS=$(STDOPTS) $(WARNOPTS) $(OPTOPTS) \
|
||||||
|
$(STLPORTINC) $(STLPORTOPTS) -I$(BOOST_WIN) $(PYINC)
|
||||||
|
|
||||||
|
LD=mwld
|
||||||
|
LDOPTS=-export dllexport -shared
|
||||||
|
|
||||||
|
OBJ=classes.obj conversions.obj errors.obj extension_class.obj functions.obj \
|
||||||
|
init_function.obj module_builder.obj \
|
||||||
|
objects.obj types.obj cross_module.obj
|
||||||
|
|
||||||
|
.SUFFIXES: .obj .cpp
|
||||||
|
|
||||||
|
all: libboost_python.lib \
|
||||||
|
boost_python_test.pyd \
|
||||||
|
abstract.pyd \
|
||||||
|
getting_started1.pyd getting_started2.pyd \
|
||||||
|
simple_vector.pyd \
|
||||||
|
do_it_yourself_convts.pyd \
|
||||||
|
nested.pyd \
|
||||||
|
pickle1.pyd pickle2.pyd pickle3.pyd \
|
||||||
|
noncopyable_export.pyd noncopyable_import.pyd \
|
||||||
|
ivect.pyd dvect.pyd \
|
||||||
|
richcmp1.pyd richcmp2.pyd richcmp3.pyd
|
||||||
|
|
||||||
|
libboost_python.lib: $(OBJ)
|
||||||
|
$(LD) -library -o libboost_python.lib $(OBJ)
|
||||||
|
|
||||||
|
boost_python_test.pyd: $(OBJ) comprehensive.obj
|
||||||
|
$(LD) $(LDOPTS) $(OBJ) comprehensive.obj $(PYLIB) -o boost_python_test.pyd
|
||||||
|
|
||||||
|
abstract.pyd: $(OBJ) abstract.obj
|
||||||
|
$(LD) $(LDOPTS) $(OBJ) abstract.obj $(PYLIB) -o abstract.pyd
|
||||||
|
|
||||||
|
getting_started1.pyd: $(OBJ) getting_started1.obj
|
||||||
|
$(LD) $(LDOPTS) $(OBJ) getting_started1.obj $(PYLIB) -o getting_started1.pyd
|
||||||
|
|
||||||
|
getting_started2.pyd: $(OBJ) getting_started2.obj
|
||||||
|
$(LD) $(LDOPTS) $(OBJ) getting_started2.obj $(PYLIB) -o getting_started2.pyd
|
||||||
|
|
||||||
|
simple_vector.pyd: $(OBJ) simple_vector.obj
|
||||||
|
$(LD) $(LDOPTS) $(OBJ) simple_vector.obj $(PYLIB) -o simple_vector.pyd
|
||||||
|
|
||||||
|
do_it_yourself_convts.pyd: $(OBJ) do_it_yourself_convts.obj
|
||||||
|
$(LD) $(LDOPTS) $(OBJ) do_it_yourself_convts.obj $(PYLIB) -o do_it_yourself_convts.pyd
|
||||||
|
|
||||||
|
nested.pyd: $(OBJ) nested.obj
|
||||||
|
$(LD) $(LDOPTS) $(OBJ) nested.obj $(PYLIB) -o nested.pyd
|
||||||
|
|
||||||
|
pickle1.pyd: $(OBJ) pickle1.obj
|
||||||
|
$(LD) $(LDOPTS) $(OBJ) pickle1.obj $(PYLIB) -o pickle1.pyd
|
||||||
|
|
||||||
|
pickle2.pyd: $(OBJ) pickle2.obj
|
||||||
|
$(LD) $(LDOPTS) $(OBJ) pickle2.obj $(PYLIB) -o pickle2.pyd
|
||||||
|
|
||||||
|
pickle3.pyd: $(OBJ) pickle3.obj
|
||||||
|
$(LD) $(LDOPTS) $(OBJ) pickle3.obj $(PYLIB) -o pickle3.pyd
|
||||||
|
|
||||||
|
noncopyable_export.pyd: $(OBJ) noncopyable_export.obj
|
||||||
|
$(LD) $(LDOPTS) $(OBJ) noncopyable_export.obj $(PYLIB) -o noncopyable_export.pyd
|
||||||
|
|
||||||
|
noncopyable_import.pyd: $(OBJ) noncopyable_import.obj
|
||||||
|
$(LD) $(LDOPTS) $(OBJ) noncopyable_import.obj $(PYLIB) -o noncopyable_import.pyd
|
||||||
|
|
||||||
|
ivect.pyd: $(OBJ) ivect.obj
|
||||||
|
$(LD) $(LDOPTS) $(OBJ) ivect.obj $(PYLIB) -o ivect.pyd
|
||||||
|
|
||||||
|
dvect.pyd: $(OBJ) dvect.obj
|
||||||
|
$(LD) $(LDOPTS) $(OBJ) dvect.obj $(PYLIB) -o dvect.pyd
|
||||||
|
|
||||||
|
richcmp1.pyd: $(OBJ) richcmp1.obj
|
||||||
|
$(LD) $(LDOPTS) $(OBJ) richcmp1.obj $(PYLIB) -o richcmp1.pyd
|
||||||
|
|
||||||
|
richcmp2.pyd: $(OBJ) richcmp2.obj
|
||||||
|
$(LD) $(LDOPTS) $(OBJ) richcmp2.obj $(PYLIB) -o richcmp2.pyd
|
||||||
|
|
||||||
|
richcmp3.pyd: $(OBJ) richcmp3.obj
|
||||||
|
$(LD) $(LDOPTS) $(OBJ) richcmp3.obj $(PYLIB) -o richcmp3.pyd
|
||||||
|
|
||||||
|
.cpp.obj:
|
||||||
|
$(CPP) $(CPPOPTS) -c $*.cpp
|
||||||
|
|
||||||
|
test:
|
||||||
|
$(PYEXE) comprehensive.py
|
||||||
|
$(PYEXE) test_abstract.py
|
||||||
|
$(PYEXE) test_getting_started1.py
|
||||||
|
$(PYEXE) test_getting_started2.py
|
||||||
|
$(PYEXE) test_simple_vector.py
|
||||||
|
$(PYEXE) test_do_it_yourself_convts.py
|
||||||
|
$(PYEXE) test_nested.py
|
||||||
|
$(PYEXE) test_pickle1.py
|
||||||
|
$(PYEXE) test_pickle2.py
|
||||||
|
$(PYEXE) test_pickle3.py
|
||||||
|
$(PYEXE) test_cross_module.py
|
||||||
|
$(PYEXE) test_richcmp1.py
|
||||||
|
$(PYEXE) test_richcmp2.py
|
||||||
|
$(PYEXE) test_richcmp3.py
|
||||||
|
|
||||||
|
clean:
|
||||||
|
-del *.obj
|
||||||
|
-del *.lib
|
||||||
|
-del *.exp
|
||||||
|
-del *.idb
|
||||||
|
-del *.pyd
|
||||||
|
-del *.pyc
|
||||||
|
|
||||||
|
softlinks:
|
||||||
|
python $(BOOST_UNIX)/libs/python/build/filemgr.py $(BOOST_UNIX) softlinks
|
||||||
|
|
||||||
|
unlink:
|
||||||
|
python $(BOOST_UNIX)/libs/python/build/filemgr.py $(BOOST_UNIX) unlink
|
||||||
|
|
||||||
|
cp:
|
||||||
|
python $(BOOST_UNIX)/libs/python/build/filemgr.py $(BOOST_UNIX) cp
|
||||||
|
|
||||||
|
rm:
|
||||||
|
python $(BOOST_UNIX)/libs/python/build/filemgr.py $(BOOST_UNIX) rm
|
||||||
|
|
||||||
|
copy:
|
||||||
|
$(PYEXE) $(BOOST_WIN)\libs\python\build\filemgr.py $(BOOST_WIN) copy
|
||||||
|
|
||||||
|
del:
|
||||||
|
$(PYEXE) $(BOOST_WIN)\libs\python\build\filemgr.py $(BOOST_WIN) del
|
||||||
2
build/win32_mwcc_setup.bat
Executable file
2
build/win32_mwcc_setup.bat
Executable file
@@ -0,0 +1,2 @@
|
|||||||
|
call "c:\program files\metrowerks\codewarrior\other metrowerks tools\command line tools\cwenv.bat"
|
||||||
|
set MWWinx86LibraryFiles=MSL_All-DLL_x86.lib;gdi32.lib;user32.lib;kernel32.lib
|
||||||
59
doc/boost.css
Normal file
59
doc/boost.css
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
H1
|
||||||
|
{
|
||||||
|
FONT-SIZE: 200%
|
||||||
|
COLOR: #00007f
|
||||||
|
}
|
||||||
|
H2
|
||||||
|
{
|
||||||
|
FONT-SIZE: 150%;
|
||||||
|
}
|
||||||
|
H3
|
||||||
|
{
|
||||||
|
FONT-SIZE: 125%;
|
||||||
|
}
|
||||||
|
H4
|
||||||
|
{
|
||||||
|
FONT-SIZE: 108%;
|
||||||
|
}
|
||||||
|
BODY
|
||||||
|
{
|
||||||
|
FONT-SIZE: 100%;
|
||||||
|
BACKGROUND-COLOR: #ffffff
|
||||||
|
}
|
||||||
|
PRE
|
||||||
|
{
|
||||||
|
MARGIN-LEFT: 2pc;
|
||||||
|
FONT-SIZE: 80%;
|
||||||
|
BACKGROUND-COLOR: #dfffff
|
||||||
|
}
|
||||||
|
CODE
|
||||||
|
{
|
||||||
|
FONT-SIZE: 95%;
|
||||||
|
white-space: pre
|
||||||
|
}
|
||||||
|
.index
|
||||||
|
{
|
||||||
|
TEXT-ALIGN: left
|
||||||
|
}
|
||||||
|
.page-index
|
||||||
|
{
|
||||||
|
TEXT-ALIGN: left
|
||||||
|
}
|
||||||
|
.definition
|
||||||
|
{
|
||||||
|
TEXT-ALIGN: left
|
||||||
|
}
|
||||||
|
.footnote
|
||||||
|
{
|
||||||
|
FONT-SIZE: 66%;
|
||||||
|
VERTICAL-ALIGN: super;
|
||||||
|
TEXT-DECORATION: none
|
||||||
|
}
|
||||||
|
.function-semantics
|
||||||
|
{
|
||||||
|
CLEAR: left
|
||||||
|
}
|
||||||
|
.metafunction-semantics
|
||||||
|
{
|
||||||
|
CLEAR: left
|
||||||
|
}
|
||||||
@@ -9,172 +9,214 @@
|
|||||||
"../../../c++boost.gif" alt="c++boost.gif (8819 bytes)">Building an
|
"../../../c++boost.gif" alt="c++boost.gif (8819 bytes)">Building an
|
||||||
Extension Module</h1>
|
Extension Module</h1>
|
||||||
|
|
||||||
<p>The build process for Boost is currently undergoing some evolution,
|
<h2>Building Boost.Python</h2>
|
||||||
and, it is to be hoped, improvement. The following facts may help:
|
|
||||||
|
|
||||||
<hr>
|
<p>Every Boost.Python extension module must be linked with the
|
||||||
Makefiles for various platforms and a Visual Studio project
|
<code>boost_python</code> shared library. To build
|
||||||
reside in the Boost subdirectory <tt>libs/python/build</tt>.
|
<code>boost_python</code>, use <a
|
||||||
Build targets include:
|
href="../../../tools/build/index.html">Boost.Build</a> in the
|
||||||
|
usual way from the <code>libs/python/build</code> subdirectory
|
||||||
|
of your boost installation (if you have already built boost from
|
||||||
|
the top level this may have no effect, since the work is already
|
||||||
|
done).
|
||||||
|
|
||||||
|
<h3>Configuration</h3>
|
||||||
|
You may need to configure the following variables to point Boost.Build at your Python installation:
|
||||||
|
|
||||||
|
<table border="1">
|
||||||
|
<tr><th>Variable Name <th>Semantics <th>Default <th>Notes
|
||||||
|
<tr>
|
||||||
|
<td><code>PYTHON_ROOT</code>
|
||||||
|
<td>The root directory of your Python installation
|
||||||
|
<td>Windows: <code>c:/tools/python</code>
|
||||||
|
Unix: <code>/usr/local</code>
|
||||||
|
<td>On Unix, this is the <code>--with-prefix=</code> directory
|
||||||
|
used to configure Python
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>PYTHON_VERSION</code>
|
||||||
|
<td>The The 2-part python Major.Minor version number
|
||||||
|
<td>Windows: <code>2.1</code>
|
||||||
|
Unix: <code>1.5</code>
|
||||||
|
<td>Be sure not to include a third number, e.g. <b>not</b>
|
||||||
|
"<code>2.2.1</code>", even if that's the version you
|
||||||
|
have.
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>PYTHON_INCLUDES</code>
|
||||||
|
<td>path to Python <code>#include</code> directories
|
||||||
|
<td>Autoconfigured from <code>PYTHON_ROOT</code>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>PYTHON_LIB_PATH</code>
|
||||||
|
<td>path to Python library object.
|
||||||
|
<td>Autoconfigured from <code>PYTHON_ROOT</code>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>PYTHON_STDLIB_PATH</code>
|
||||||
|
<td>path to Python standard library modules
|
||||||
|
<td>Autoconfigured from <code>PYTHON_ROOT</code>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>CYGWIN_ROOT</code>
|
||||||
|
<td>path to the user's Cygwin installation
|
||||||
|
<td>
|
||||||
|
<td><a href="http://www.cygwin.com">Cygwin</a> only. This and the following two settings are
|
||||||
|
useful when building with multiple toolsets on Windows, since
|
||||||
|
Cygwin requires a different build of Python.
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>GCC_PYTHON_ROOT</code>
|
||||||
|
<td>path to the user's Cygwin Python installation
|
||||||
|
<td><code>$(CYGWIN_ROOT)/usr/local</code>
|
||||||
|
<td><a href="http://www.cygwin.com">Cygwin</a> only
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>GCC_DEBUG_PYTHON_ROOT</code>
|
||||||
|
<td>path to the user's Cygwin <code><a
|
||||||
|
href="#variants">pydebug</a></code> build
|
||||||
|
<td><code>$(CYGWIN_ROOT)/usr/local/pydebug</code>
|
||||||
|
<td><a href="http://www.cygwin.com">Cygwin</a> only
|
||||||
|
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h3>Results</h3>
|
||||||
|
<p>The build process will create a
|
||||||
|
<code>libs/python/build/bin-stage</code> subdirectory of the
|
||||||
|
boost root (or of <code>$(ALL_LOCATE_TARGET)</code>,
|
||||||
|
if you have set that variable), containing the built
|
||||||
|
libraries. The libraries are actually built to unique
|
||||||
|
directories for each toolset and variant elsewhere in the
|
||||||
|
filesystem, and copied to the
|
||||||
|
<code>bin-stage</code> directory as a convenience, so if you
|
||||||
|
build with multiple toolsets at once, the product of later
|
||||||
|
toolsets will overwrite that of earlier toolsets in
|
||||||
|
<code>bin-stage</code>.
|
||||||
|
|
||||||
|
<h3>Testing</h3>
|
||||||
|
<p>To build and test Boost.Python from within the
|
||||||
|
<code>libs/python/build</code> directory, invoke
|
||||||
|
<blockquote>
|
||||||
|
<pre>
|
||||||
|
bjam -sTOOLS=<i><a href="../../../tools/build/index.html#Tools">toolset</a></i> test
|
||||||
|
</pre>
|
||||||
|
</blockquote>
|
||||||
|
This will
|
||||||
|
update all of the Boost.Python v1 test and example targets. The tests
|
||||||
|
are relatively quiet by default. To get more-verbose output, you might try
|
||||||
|
<blockquote>
|
||||||
|
<pre>
|
||||||
|
bjam -sTOOLS=<i><a href="../../../tools/build/index.html#Tools">toolset</a></i> -sPYTHON_TEST_ARGS=-v test
|
||||||
|
</pre>
|
||||||
|
</blockquote>
|
||||||
|
which will print each test's Python code with the expected output as
|
||||||
|
it passes.
|
||||||
|
|
||||||
|
<h2>Building your Extension Module</h2>
|
||||||
|
|
||||||
|
Though there are other approaches, the easiest way to build an
|
||||||
|
extension module using Boost.Python is with Boost.Build. Until
|
||||||
|
Boost.Build v2 is released, cross-project build dependencies are
|
||||||
|
not supported, so it works most smoothly if you add a new
|
||||||
|
subproject to your boost installation. The
|
||||||
|
<code>libs/python/example</code> subdirectory of your boost
|
||||||
|
installation contains a minimal example (along with many extra
|
||||||
|
sources). To copy the example subproject:
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li>Create a new subdirectory in, <code>libs/python</code>, say
|
||||||
|
<code>libs/python/my_project</code>.
|
||||||
|
|
||||||
|
<li>Copy <code><a
|
||||||
|
href="../example/Jamfile">libs/python/example/Jamfile</a></code>
|
||||||
|
to your new directory.
|
||||||
|
|
||||||
|
<li>Edit the Jamfile as appropriate for your project. You'll
|
||||||
|
want to change the "<code>subproject</code>" rule
|
||||||
|
invocation at the top, and the names of some of the source files
|
||||||
|
and/or targets.
|
||||||
|
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
If you can't modify or copy your boost installation, the
|
||||||
|
alternative is to create your own Boost.Build project. A similar
|
||||||
|
example you can use as a starting point is available in <code><a
|
||||||
|
href="../example/project.zip">this archive</a></code>. You'll
|
||||||
|
need to edit the Jamfile and Jamrules files, depending on the
|
||||||
|
relative location of your Boost installation and the new
|
||||||
|
project. Note that automatic testing of extension modules is not
|
||||||
|
available in this configuration.
|
||||||
|
|
||||||
|
<h2><a name="variants">Build Variants</a></h2>
|
||||||
|
|
||||||
|
Three <a
|
||||||
|
href="../../../tools/build/build_system.htm#variants">variant</a>
|
||||||
|
configurations of all python-related targets are supported, and
|
||||||
|
can be selected by setting the <code><a
|
||||||
|
href="../../../tools/build/build_system.htm#user_globals">BUILD</a></code>
|
||||||
|
variable:
|
||||||
|
|
||||||
<ul>
|
<ul>
|
||||||
<li>The <tt>boost_python</tt> library for static linking with your
|
<li><code>release</code> (optimization, <tt>-DNDEBUG</tt>)
|
||||||
extension module. On the various Unices, this library will be
|
|
||||||
called <tt>libboost_python.a</tt>. When using Visual C++, the
|
|
||||||
library will be called <tt>boost_python.lib</tt>.
|
|
||||||
|
|
||||||
<p>
|
<li><code>debug</code> (no optimization <tt>-D_DEBUG</tt>)
|
||||||
<li>A comprehensive test of Boost.Python features. This test builds
|
|
||||||
a Boost.Python extension module, then runs Python to import the
|
|
||||||
module, and runs a series of tests on it using <tt><a href=
|
|
||||||
"../test/doctest.py">doctest</a></tt>. Source code for the module
|
|
||||||
and tests is available in the Boost subdirectory
|
|
||||||
<tt>libs/python/test</tt>.
|
|
||||||
|
|
||||||
<p>
|
<li><code>debug-python</code> (no optimization, <tt>-D_DEBUG
|
||||||
<li>Various examples from the Boost subdirectory
|
|
||||||
<tt>libs/python/example</tt>.
|
|
||||||
All these examples include a doctest modeled
|
|
||||||
on the comprehensive test above.
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
There is a group of makefiles with support for simultaneous
|
|
||||||
compilation on multiple platforms and a consistent set of
|
|
||||||
features that build the <tt>boost_python</tt> library for static
|
|
||||||
linking, the comprehensive test, and all examples in
|
|
||||||
<tt>libs/python/example</tt>:
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li><a href="../build/vc60.mak">vc60.mak</a>:
|
|
||||||
Visual C++ 6.0 Service Pack 4
|
|
||||||
|
|
||||||
<li><a href="../build/mingw32.mak">mingw32.mak</a>:
|
|
||||||
mingw32 (Win32-targeted) gcc 2.95.2
|
|
||||||
|
|
||||||
<li><a href="../build/linux_gcc.mak">linux_gcc.mak</a>:
|
|
||||||
gcc 2.95.2 on Linux/Unix
|
|
||||||
|
|
||||||
<li><a href="../build/tru64_cxx.mak">tru64_cxx.mak</a>:
|
|
||||||
Compaq Alpha using the Compaq cxx compiler
|
|
||||||
|
|
||||||
<li><a href="../build/irix_CC.mak">irix_CC.mak</a>:
|
|
||||||
Silicon Graphics IRIX 6.5 CC compiler
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
<a href="http://cctbx.sourceforge.net/page_installation_adv.html#installation_boost_python"
|
|
||||||
>Usage of these makefiles is described here.</a>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
There is another group of makefiles for GNU make.
|
|
||||||
These makefiles are less redundant than the makefiles
|
|
||||||
in the group above,
|
|
||||||
but the list of compilation targets is not as complete
|
|
||||||
and there is no support for simultaneous compilation
|
|
||||||
on multiple platforms.
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li><a href="../build/como.mak">como.mak</a>:
|
|
||||||
Comeau C++ on Linux
|
|
||||||
|
|
||||||
<li><a href="../build/gcc.mak">gcc.mak</a>:
|
|
||||||
GCC on Linux/Unix.
|
|
||||||
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
A project workspace for Microsoft Visual Studio is provided at <tt><a
|
|
||||||
href="../build/build.dsw">libs/python/build/build.dsw</a></tt>. The
|
|
||||||
include paths for this project may need to be changed for your
|
|
||||||
installation. They currently assume that python has been installed at
|
|
||||||
<tt>c:\tools\python</tt>. Three configurations of all targets are
|
|
||||||
supported:
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>Release (optimization, <tt>-DNDEBUG</tt>)
|
|
||||||
|
|
||||||
<li>Debug (no optimization <tt>-D_DEBUG</tt>)
|
|
||||||
|
|
||||||
<li>DebugPython (no optimization, <tt>-D_DEBUG
|
|
||||||
-DBOOST_DEBUG_PYTHON</tt>)
|
-DBOOST_DEBUG_PYTHON</tt>)
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<p>When extension modules are built with Visual C++ using
|
<p>The first two variants of the <code>boost_python</code>
|
||||||
|
library are built by default, and are compatible with the
|
||||||
|
default Python distribution. The <code>debug-python</code>
|
||||||
|
variant corresponds to a specially-built debugging version of
|
||||||
|
Python. On Unix platforms, this python is built by adding
|
||||||
|
<code>--with-pydebug</code> when configuring the Python
|
||||||
|
build. On Windows, the debugging version of Python is generated
|
||||||
|
by the "Win32 Debug" target of the
|
||||||
|
<code>PCBuild.dsw</code> Visual C++ 6.0 project in the
|
||||||
|
<code>PCBuild</code> subdirectory of your Python distribution.
|
||||||
|
|
||||||
|
Extension modules built with Python debugging enabled are <b>not
|
||||||
|
link-compatible</b> with a non-debug build of Python. Since few
|
||||||
|
people actually have a debug build of Python (it doesn't come
|
||||||
|
with the standard distribution), the normal
|
||||||
|
<code>debug</code> variant builds modules which are compatible
|
||||||
|
with ordinary Python.
|
||||||
|
|
||||||
|
|
||||||
|
<p>On many windows compilers, when extension modules are built
|
||||||
|
with
|
||||||
<tt>-D_DEBUG</tt>, Python defaults to <i>force</i> linking with a
|
<tt>-D_DEBUG</tt>, Python defaults to <i>force</i> linking with a
|
||||||
special debugging version of the Python DLL. Since this debug DLL
|
special debugging version of the Python DLL. Since this debug DLL
|
||||||
isn't supplied with the default Python installation for Windows,
|
isn't supplied with the default Python installation for Windows,
|
||||||
Boost.Python uses <tt><a href=
|
Boost.Python uses <tt><a href=
|
||||||
"../../../boost/python/detail/wrap_python.hpp">boost/python/detail/wrap_python.hpp</a></tt>
|
"../../../boost/python/detail/wrap_python.hpp">boost/python/detail/wrap_python.hpp</a></tt>
|
||||||
to temporarily undefine <tt>_DEBUG</tt> when <tt>Python.h</tt> is
|
to temporarily undefine <tt>_DEBUG</tt> when <tt>Python.h</tt> is
|
||||||
<tt>#include</tt>d.
|
<tt>#include</tt>d - unless <code>BOOST_DEBUG_PYTHON</code> is defined.
|
||||||
|
|
||||||
<p>If you want the extra runtime checks available with the debugging
|
<p>If you want the extra runtime checks available with the
|
||||||
version of the library, <tt>#define BOOST_DEBUG_PYTHON</tt> to
|
debugging version of the library, <tt>#define
|
||||||
re-enable library forcing, and link with the DebugPython version of
|
BOOST_DEBUG_PYTHON</tt> to re-enable python debuggin, and link
|
||||||
<tt>boost_python.lib</tt>. You'll need to get the debugging version
|
with the <code>debug-python</code> variant of
|
||||||
of the Python executable (<tt>python_d.exe</tt>) and DLL
|
<tt>boost_python</tt>.
|
||||||
(<tt>python20_d.dll</tt> or <tt>python15_d.dll</tt>). The Python
|
|
||||||
sources include project files for building these. If you <a href=
|
|
||||||
"http://www.python.org">download</a> them, change the name of the
|
|
||||||
top-level directory to <tt>src</tt>, and install it under
|
|
||||||
<tt>c:\tools\python</tt>, the workspace supplied by Boost.Python will
|
|
||||||
be able to use it without modification. Just open
|
|
||||||
<tt>c:\tools\python\src\pcbuild\pcbuild.dsw</tt> and invoke "build
|
|
||||||
all" to generate all the debugging targets.
|
|
||||||
|
|
||||||
<p>If you do not <tt>#define BOOST_DEBUG_PYTHON</tt>, be sure that
|
<p>If you do not <tt>#define BOOST_DEBUG_PYTHON</tt>, be sure that
|
||||||
any source files <tt>#include <<a href=
|
any source files in your extension module <tt>#include <<a href=
|
||||||
"../../../boost/python/detail/wrap_python.hpp">boost/python/detail/wrap_python.hpp</a>></tt>
|
"../../../boost/python/detail/wrap_python.hpp">boost/python/detail/wrap_python.hpp</a>></tt>
|
||||||
instead of the usual <tt>Python.h</tt>, or you will have link
|
instead of the usual <tt>Python.h</tt>, or you will have link
|
||||||
incompatibilities.<br>
|
incompatibilities.<br>
|
||||||
|
|
||||||
<hr>
|
|
||||||
If your platform isn't directly supported, you can build a static
|
|
||||||
library from the following source files (in the Boost subdirectory
|
|
||||||
<tt>libs/python/src</tt>), or compile them directly and link the
|
|
||||||
resulting objects into your extension module:
|
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li><a href=
|
|
||||||
"../../../libs/python/src/classes.cpp">classes.cpp</a>
|
|
||||||
|
|
||||||
<li><a href=
|
|
||||||
"../../../libs/python/src/conversions.cpp">conversions.cpp</a>
|
|
||||||
|
|
||||||
<li><a href=
|
|
||||||
"../../../libs/python/src/cross_module.cpp">cross_module.cpp</a>
|
|
||||||
|
|
||||||
<li><a href=
|
|
||||||
"../../../libs/python/src/extension_class.cpp">extension_class.cpp</a>
|
|
||||||
|
|
||||||
<li><a href=
|
|
||||||
"../../../libs/python/src/functions.cpp">functions.cpp</a>
|
|
||||||
|
|
||||||
<li><a href=
|
|
||||||
"../../../libs/python/src/init_function.cpp">init_function.cpp</a>
|
|
||||||
|
|
||||||
<li><a href=
|
|
||||||
"../../../libs/python/src/module_builder.cpp">module_builder.cpp</a>
|
|
||||||
|
|
||||||
<li><a href=
|
|
||||||
"../../../libs/python/src/objects.cpp">objects.cpp</a>
|
|
||||||
|
|
||||||
<li><a href=
|
|
||||||
"../../../libs/python/src/types.cpp">types.cpp</a>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
Next: <a href="enums.html">Wrapping Enums</a> Previous: <a href=
|
Next: <a href="enums.html">Wrapping Enums</a> Previous: <a href=
|
||||||
"under-the-hood.html">A Peek Under the Hood</a> Up: <a href=
|
"under-the-hood.html">A Peek Under the Hood</a> Up: <a href=
|
||||||
"index.html">Top</a>
|
"index.html">Top</a>
|
||||||
|
|
||||||
<hr>
|
<hr>
|
||||||
<p>© Copyright David Abrahams 2000. Permission to copy, use, modify,
|
<p>© Copyright David Abrahams 2002. Permission to copy, use, modify,
|
||||||
sell and distribute this document is granted provided this copyright
|
sell and distribute this document is granted provided this copyright
|
||||||
notice appears in all copies. This document is provided ``as is'' without
|
notice appears in all copies. This document is provided ``as is'' without
|
||||||
express or implied warranty, and with no claim as to its suitability for
|
express or implied warranty, and with no claim as to its suitability for
|
||||||
any purpose.
|
any purpose.
|
||||||
|
|
||||||
<p>Updated: Apr 17, 2001 (R.W. Grosse-Kunstleve)
|
<p>Updated: May 15, 2002 (David Abrahams)
|
||||||
</div>
|
</div>
|
||||||
|
|||||||
@@ -37,19 +37,12 @@ namespace python = boost::python;
|
|||||||
|
|
||||||
BOOST_PYTHON_MODULE_INIT(getting_started1)
|
BOOST_PYTHON_MODULE_INIT(getting_started1)
|
||||||
{
|
{
|
||||||
try
|
|
||||||
{
|
|
||||||
// Create an object representing this extension module.
|
// Create an object representing this extension module.
|
||||||
python::module_builder this_module("getting_started1");
|
python::module_builder this_module("getting_started1");
|
||||||
|
|
||||||
// Add regular functions to the module.
|
// Add regular functions to the module.
|
||||||
this_module.def(greet, "greet");
|
this_module.def(greet, "greet");
|
||||||
this_module.def(square, "square");
|
this_module.def(square, "square");
|
||||||
}
|
|
||||||
catch(...)
|
|
||||||
{
|
|
||||||
python::handle_exception(); // Deal with the exception for Python
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</pre>
|
</pre>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
|
|||||||
@@ -47,8 +47,6 @@ namespace python = boost::python;
|
|||||||
|
|
||||||
BOOST_PYTHON_MODULE_INIT(getting_started2)
|
BOOST_PYTHON_MODULE_INIT(getting_started2)
|
||||||
{
|
{
|
||||||
try
|
|
||||||
{
|
|
||||||
// Create an object representing this extension module.
|
// Create an object representing this extension module.
|
||||||
python::module_builder this_module("getting_started2");
|
python::module_builder this_module("getting_started2");
|
||||||
|
|
||||||
@@ -65,11 +63,6 @@ BOOST_PYTHON_MODULE_INIT(getting_started2)
|
|||||||
|
|
||||||
// Even better, invite() can also be made a member of hello_class!!!
|
// Even better, invite() can also be made a member of hello_class!!!
|
||||||
hello_class.def(invite, "invite");
|
hello_class.def(invite, "invite");
|
||||||
}
|
|
||||||
catch(...)
|
|
||||||
{
|
|
||||||
python::handle_exception(); // Deal with the exception for Python
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</blockquote></pre>
|
</blockquote></pre>
|
||||||
<p>
|
<p>
|
||||||
@@ -98,6 +91,12 @@ Notes:<ul>
|
|||||||
|
|
||||||
<li>Any function added to a class whose initial argument matches the class (or
|
<li>Any function added to a class whose initial argument matches the class (or
|
||||||
any base) will act like a member function in Python.
|
any base) will act like a member function in Python.
|
||||||
|
|
||||||
|
<li>To define a nested class, just pass the enclosing
|
||||||
|
<tt>class_builder</tt> (instead of a <tt>module_builder</tt>) as the
|
||||||
|
first argument to the nested <tt>class_builder</tt>'s constructor.
|
||||||
|
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
<p>
|
<p>
|
||||||
We can even make a subclass of <code>hello.world</code>:
|
We can even make a subclass of <code>hello.world</code>:
|
||||||
|
|||||||
133
doc/index.html
133
doc/index.html
@@ -16,62 +16,101 @@
|
|||||||
intrusive on your C++ design. In most cases, you should not have to alter
|
intrusive on your C++ design. In most cases, you should not have to alter
|
||||||
your C++ classes in any way in order to use them with Boost.Python. The system
|
your C++ classes in any way in order to use them with Boost.Python. The system
|
||||||
<em>should</em> simply ``reflect'' your C++ classes and functions into
|
<em>should</em> simply ``reflect'' your C++ classes and functions into
|
||||||
Python. The major features of Boost.Python include support for:
|
Python.
|
||||||
<ul>
|
|
||||||
<li><a href="inheritance.html">Subclassing extension types in Python</a>
|
|
||||||
<li><a href="overriding.html">Overriding virtual functions in Python</a>
|
|
||||||
<li><a href="overloading.html">[Member] function Overloading</a>
|
|
||||||
<li><a href="special.html#numeric_auto">Automatic wrapping of numeric operators</a>
|
|
||||||
</ul>
|
|
||||||
among others.
|
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
<table border="1">
|
||||||
|
<tr><td> <b>Note:</b> this is the last official release of
|
||||||
|
Boost.Python v1. Development of this version of the library has
|
||||||
|
stopped; it will be retired soon in favor of the redesigned and
|
||||||
|
improved version 2. A summary of the development goals is available on
|
||||||
|
the Python <a href="http://www.python.org/sigs/c++-sig/">C++-sig</a>
|
||||||
|
page, which also serves as a mailing list for users of both versions
|
||||||
|
of the library. A preview of the v2 documentation is available <a
|
||||||
|
href="http://cvs.sourceforge.net/cgi-bin/viewcvs.cgi/*checkout*/boost/boost/libs/python/doc/v2/index.html?rev=HEAD&content-type=text/html">here</a>,
|
||||||
|
and instructions for getting started with a prerelease are available
|
||||||
|
upon request.
|
||||||
|
</table>
|
||||||
|
|
||||||
<h2>Supported Platforms</h2>
|
<h2>Supported Platforms</h2>
|
||||||
<p>Boost.Python is known to have been tested in the following configurations:
|
<p>Boost.Python is known to have been tested
|
||||||
|
against <a href="http://www.python/org/2.2.1">Python 2.2.1</a> using
|
||||||
|
the following compilers:
|
||||||
|
|
||||||
<ul>
|
|
||||||
<li>Against Python 2.0 using the following compiler/library combinations:
|
|
||||||
<ul>
|
<ul>
|
||||||
<li><a
|
<li><a
|
||||||
href="http://msdn.microsoft.com/vstudio/sp/vs6sp4/dnldoverview.asp">MSVC++6sp4</a>
|
href="http://msdn.microsoft.com/vstudio/downloads/updates/sp/vs6/sp5/default.asp">MSVC++6sp5</a>.
|
||||||
with the native library.
|
All tests pass.
|
||||||
|
|
||||||
<li>An upcoming release of <a
|
<li><a
|
||||||
href="http://www.metrowerks.com/products/windows/">Metrowerks
|
href="http://msdn.microsoft.com/vstudio/downloads/updates/sp/vs6/sp5/default.asp">MSVC++6sp5</a>
|
||||||
CodeWarrior Pro6 for Windows</a> with the native library (the first
|
with <a href="http://www.stlport.org">STLPort</a>-4.5.3. A compiler bug interferes with
|
||||||
release has a bug that's fatal to Boost.Python)
|
<a
|
||||||
|
href="../example/simple_vector.cpp">libs/python/example/simple_vector.cpp</a>. All
|
||||||
|
other tests pass.
|
||||||
|
|
||||||
<li><a
|
<p>
|
||||||
|
<li><a href="http://msdn.microsoft.com/visualc/">MSVC++7 (Visual
|
||||||
|
Studio .NET)</a>. All tests pass.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<li><a href="http://www.metrowerks.com/products/windows/">Metrowerks
|
||||||
|
CodeWarrior Pro7.2 and Pro7.0 for Windows</a>. All tests pass.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<li><a href="http://gcc.gnu.org">GCC 3.0.4</a> under <a
|
||||||
|
href="http://www.cygwin.com">Cygwin</a> and
|
||||||
|
<a href="http://www.redhat.com/">RedHat Linux 7.1</a>.
|
||||||
|
All tests pass.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<li>Compaq C++ V6.2-024 for Digital UNIX (an <a
|
||||||
|
href="http://www.edg.com/">EDG</a>-based compiler).
|
||||||
|
All tests pass.<br>
|
||||||
|
Note that the Boost.Compatibility
|
||||||
|
library must be included (see e.g. tru64_cxx.mak in the build
|
||||||
|
directory).
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<li>Silicon Graphics MIPSpro Version 7.3.1.2m (an <a
|
||||||
|
href="http://www.edg.com/">EDG</a>-based compiler).
|
||||||
|
All tests pass.<br>
|
||||||
|
Note that the Boost.Compatibility
|
||||||
|
library must be included (see e.g. irix_CC.mak in the build
|
||||||
|
directory).
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<li><a href="http://gcc.gnu.org">GCC 2.95.2</a> under <a
|
||||||
|
href="http://www.mingw.org">MinGW</a> and <a
|
||||||
|
href="http://www.redhat.com/">RedHat Linux 7.1</a>.
|
||||||
|
Compilation succeeds, but some tests fail at runtime due to
|
||||||
|
exception handling bugs. It is therefore highly recommended
|
||||||
|
to use GCC 3.0.4 instead.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<li><a
|
||||||
href="http://developer.intel.com/software/products/compilers/c50/">Intel
|
href="http://developer.intel.com/software/products/compilers/c50/">Intel
|
||||||
C++ 5.0</a>. Compilation succeeds, but tests <font
|
C++ 6.0</a> beta: Comprehensive test fails to link due to a
|
||||||
color="#FF0000"><b>FAILED at runtime</b></font> due to a bug in its
|
linker bug. Other tests seem to work.
|
||||||
exception-handling implementation.
|
|
||||||
|
<p>
|
||||||
|
<li><a
|
||||||
|
href="http://developer.intel.com/software/products/compilers/c50/">Intel
|
||||||
|
C++ 5.0</a> Comprehensive test fails at runtime due to an
|
||||||
|
exception-handling bug. Other tests seem to work.
|
||||||
|
|
||||||
</ul>
|
</ul>
|
||||||
|
|
||||||
<li>Against Python 1.5.2 using the following compiler/library:
|
<p>
|
||||||
|
Note that pickling doesn't work with Python 2.2
|
||||||
|
due to a core language bug. This is fixed in
|
||||||
|
<a href="http://www.python/org/2.2.1">2.2.1</a>.
|
||||||
|
|
||||||
<ul>
|
<p>
|
||||||
<li><a
|
Boost.Python has also been used with other versions of Python back to
|
||||||
href="http://msdn.microsoft.com/vstudio/sp/vs6sp4/dnldoverview.asp">MSVC++6sp4</a>
|
Python 1.5.2. It is expected that the older Python releases still work,
|
||||||
|
but we are not regularly testing for backward compatibility.
|
||||||
<li><a
|
|
||||||
href="http://msdn.microsoft.com/vstudio/sp/vs6sp4/dnldoverview.asp">MSVC++6sp4</a>/<a
|
|
||||||
href="http://www.stlport.org">STLport 4.0</a>
|
|
||||||
|
|
||||||
<li><a href="http://gcc.gnu.org/">GCC 2.95.2</a> [by <a href="mailto:koethe@informatik.uni-hamburg.de">Ullrich
|
|
||||||
Koethe</a>]
|
|
||||||
|
|
||||||
<li><a href="http://gcc.gnu.org/">GCC 2.95.2</a>/<a href="http://www.stlport.org">STLport 4.0</a>
|
|
||||||
|
|
||||||
<li>Compaq C++ V6.2-024 for Digital UNIX V5.0 Rev. 910 (an <a
|
|
||||||
href="http://www.edg.com/">EDG</a>-based compiler) with <a
|
|
||||||
href="http://www.stlport.org/beta.html">STLport-4.1b3</a> [by <a
|
|
||||||
href="mailto:rwgk@cci.lbl.gov">Ralf W. Grosse-Kunstleve</a>]
|
|
||||||
|
|
||||||
<li>An upcoming release of <a href="http://www.metrowerks.com/products/windows/">Metrowerks CodeWarrior
|
|
||||||
Pro6 for Windows</a> (the first release has a bug that's fatal to Boost.Python)
|
|
||||||
</ul>
|
|
||||||
</ul>
|
|
||||||
|
|
||||||
<h2>Credits</h2>
|
<h2>Credits</h2>
|
||||||
<ul>
|
<ul>
|
||||||
@@ -152,8 +191,8 @@ among others.
|
|||||||
href="../test/comprehensive.cpp">cpp</a>]</code>
|
href="../test/comprehensive.cpp">cpp</a>]</code>
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
Questions should be directed to <a href=
|
Questions should be directed to the <a href=
|
||||||
"http://www.yahoogroups.com/list/boost">the boost mailing list</a>.
|
"http://www.python.org/sigs/c++-sig/">Python C++ SIG</a>.
|
||||||
|
|
||||||
<p>
|
<p>
|
||||||
© Copyright David Abrahams 2001. Permission to copy, use, modify,
|
© Copyright David Abrahams 2001. Permission to copy, use, modify,
|
||||||
@@ -162,5 +201,5 @@ among others.
|
|||||||
express or implied warranty, and with no claim as to its suitability for
|
express or implied warranty, and with no claim as to its suitability for
|
||||||
any purpose.
|
any purpose.
|
||||||
<p>
|
<p>
|
||||||
Updated: Mar 6, 2001
|
Updated: Apr 2002
|
||||||
|
|
||||||
|
|||||||
@@ -78,26 +78,19 @@ namespace python = boost::python;
|
|||||||
|
|
||||||
BOOST_PYTHON_MODULE_INIT(my_module)
|
BOOST_PYTHON_MODULE_INIT(my_module)
|
||||||
{
|
{
|
||||||
try
|
python::module_builder my_module("my_module");
|
||||||
{
|
|
||||||
python::module_builder my_module("my_module");
|
python::class_builder<Base> base_class(my_module, "Base");
|
||||||
|
base_class.def(python::constructor<>());
|
||||||
python::class_builder<Base> base_class(my_module, "Base");
|
|
||||||
base_class.def(python::constructor<void>());
|
python::class_builder<Derived> derived_class(my_module, "Derived");
|
||||||
|
derived_class.def(python::constructor<>());
|
||||||
python::class_builder<Derived> derived_class(my_module, "Derived");
|
<b>// Establish the inheritance relationship between Base and Derived
|
||||||
derived_class.def(python::constructor<void>());
|
derived_class.declare_base(base_class);</b>
|
||||||
<b>// Establish the inheritance relationship between Base and Derived
|
|
||||||
derived_class.declare_base(base_class);</b>
|
my_module.def(derived_as_base, "derived_as_base");
|
||||||
|
my_module.def(get_name, "get_name");
|
||||||
my_module.def(derived_as_base, "derived_as_base");
|
my_module.def(get_derived_x, "get_derived_x");
|
||||||
my_module.def(get_name, "get_name");
|
|
||||||
my_module.def(get_derived_x, "get_derived_x");
|
|
||||||
}
|
|
||||||
catch(...)
|
|
||||||
{
|
|
||||||
python::handle_exception(); // Deal with the exception for Python
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</pre>
|
</pre>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
@@ -144,10 +137,10 @@ struct Derived2 { int f(); };
|
|||||||
<hr>
|
<hr>
|
||||||
...
|
...
|
||||||
python::class_builder<Base> base2_class(my_module, "Base2");
|
python::class_builder<Base> base2_class(my_module, "Base2");
|
||||||
base2_class.def(python::constructor<void>());
|
base2_class.def(python::constructor<>());
|
||||||
|
|
||||||
python::class_builder<Derived2> derived2_class(my_module, "Derived2");
|
python::class_builder<Derived2> derived2_class(my_module, "Derived2");
|
||||||
derived2_class.def(python::constructor<void>());
|
derived2_class.def(python::constructor<>());
|
||||||
derived_class.declare_base(base_class, <b>python::without_downcast</b>);
|
derived_class.declare_base(base_class, <b>python::without_downcast</b>);
|
||||||
</pre>
|
</pre>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
|
|||||||
326
doc/new-conversions.html
Normal file
326
doc/new-conversions.html
Normal file
@@ -0,0 +1,326 @@
|
|||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=windows-1252">
|
||||||
|
<title>A New Type Conversion Mechanism for Boost.Python</title>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body bgcolor="#FFFFFF" text="#000000">
|
||||||
|
|
||||||
|
<p><img border="0" src="../../../c++boost.gif" width="277" height="86"
|
||||||
|
alt="boost logo"></p>
|
||||||
|
|
||||||
|
<h1>A New Type Conversion Mechanism for Boost.Python</h1>
|
||||||
|
|
||||||
|
<p>By <a href="../../../people/dave_abrahams.htm">David Abrahams</a>.
|
||||||
|
|
||||||
|
<h2>Introduction</h2>
|
||||||
|
|
||||||
|
This document describes a redesign of the mechanism for automatically
|
||||||
|
converting objects between C++ and Python. The current implementation
|
||||||
|
uses two functions for any type <tt>T</tt>:
|
||||||
|
|
||||||
|
<blockquote><pre>
|
||||||
|
U from_python(PyObject*, type<T>);
|
||||||
|
void to_python(V);
|
||||||
|
</pre></blockquote>
|
||||||
|
|
||||||
|
where U is convertible to T and T is convertible to V. These functions
|
||||||
|
are at the heart of C++/Python interoperability in Boost.Python, so
|
||||||
|
why would we want to change them? There are many reasons:
|
||||||
|
|
||||||
|
<h3>Bugs</h3>
|
||||||
|
<p>Firstly, the current mechanism relies on a common C++ compiler
|
||||||
|
bug. This is not just embarrassing: as compilers get to be more
|
||||||
|
conformant, the library stops working. The issue, in detail, is the
|
||||||
|
use of inline friend functions in templates to generate
|
||||||
|
conversions. It is a very powerful, and legal technique as long as
|
||||||
|
it's used correctly:
|
||||||
|
|
||||||
|
<blockquote><pre>
|
||||||
|
template <class Derived>
|
||||||
|
struct add_some_functions
|
||||||
|
{
|
||||||
|
friend <i>return-type</i> some_function1(..., Derived <i>cv-*-&-opt</i>, ...);
|
||||||
|
friend <i>return-type</i> some_function2(..., Derived <i>cv-*-&-opt</i>, ...);
|
||||||
|
};
|
||||||
|
|
||||||
|
template <class T>
|
||||||
|
struct some_template : add_some_functions<some_template<T> >
|
||||||
|
{
|
||||||
|
};
|
||||||
|
</pre></blockquote>
|
||||||
|
|
||||||
|
The <tt>add_some_functions</tt> template generates free functions
|
||||||
|
which operate on <tt>Derived</tt>, or on related types. Strictly
|
||||||
|
speaking the related types are not just cv-qualified <tt>Derived</tt>
|
||||||
|
values, pointers and/or references. Section 3.4.2 in the standard
|
||||||
|
describes exactly which types you must use as parameters to these
|
||||||
|
functions if you want the functions to be found
|
||||||
|
(there is also a less-technical description in section 11.5.1 of
|
||||||
|
C++PL3 <a href="#ref_1">[1]</a>). Suffice it to say that
|
||||||
|
with the current design, the <tt>from_python</tt> and
|
||||||
|
<tt>to_python</tt> functions are not supposed to be callable under any
|
||||||
|
conditions!
|
||||||
|
|
||||||
|
<h3>Compilation and Linking Time</h3>
|
||||||
|
|
||||||
|
The conversion functions generated for each wrapped class using the
|
||||||
|
above technique are not function templates, but regular functions. The
|
||||||
|
upshot is that they must <i>all</i> be generated regardless of whether
|
||||||
|
they are actually used. Generating all of those functions can slow
|
||||||
|
down module compilation, and resolving the references can slow down
|
||||||
|
linking.
|
||||||
|
|
||||||
|
<h3>Efficiency</h3>
|
||||||
|
|
||||||
|
The conversion functions are primarily used in (member) function
|
||||||
|
wrappers to convert the arguments and return values. Being functions,
|
||||||
|
converters have no interface which allows us to ask "will the
|
||||||
|
conversion succeed?" without calling the function. Since the
|
||||||
|
return value of the function must be the object to be passed as an
|
||||||
|
argument, Boost.Python currently uses C++ exception-handling to detect
|
||||||
|
an unsuccessful conversion. It's not a particularly good use of
|
||||||
|
exception-handling, since the failure is not handled very far from
|
||||||
|
where it occurred. More importantly, it means that C++ exceptions are
|
||||||
|
thrown during overload resolution as we seek an overload that matches
|
||||||
|
the arguments passed. Depending on the implementation, this approach
|
||||||
|
can result in significant slowdowns.
|
||||||
|
|
||||||
|
<p>It is also unclear that the current library generates a minimal
|
||||||
|
amount of code for any type conversion. Many of the conversion
|
||||||
|
functions are nontrivial, and partly because of compiler limitations,
|
||||||
|
they are declared <tt>inline</tt>. Also, we could have done a better
|
||||||
|
job separating the type-specific conversion code from the code which
|
||||||
|
is type-independent.
|
||||||
|
|
||||||
|
<h3>Cross-module Support</h3>
|
||||||
|
|
||||||
|
The current strategy requires every module to contain the definition
|
||||||
|
of conversions it uses. In general, a new module can never supply
|
||||||
|
conversion code which is used by another module. Ralf Grosse-Kunstleve
|
||||||
|
designed a clever system which imports conversions directly from one
|
||||||
|
library into another using some explicit declarations, but it has some
|
||||||
|
disadvantages also:
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li>The system Ullrich Koethe designed for implicit conversion between
|
||||||
|
wrapped classes related through inheritance does not currently work if
|
||||||
|
the classes are defined in separate modules.
|
||||||
|
|
||||||
|
<li>The writer of the importing module is required to know the name of
|
||||||
|
the module supplying the imported conversions.
|
||||||
|
|
||||||
|
<li>There can be only one way to extract any given C++ type from a
|
||||||
|
Python object in a given module.
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
The first item might be addressed by moving Boost.Python into a shared
|
||||||
|
library, but the other two cannot. Ralf turned the limitation in item
|
||||||
|
two into a feature: the required module is loaded implicitly when a
|
||||||
|
conversion it defines is invoked. We will probably want to provide
|
||||||
|
that functionality anyway, but it's not clear that we should require
|
||||||
|
the declaration of all such conversions. The final item is a more
|
||||||
|
serious limitation. If, for example, new numeric types are defined in
|
||||||
|
separate modules, and these types can all be converted to
|
||||||
|
<tt>double</tt>s, we have to choose just one conversion method.
|
||||||
|
|
||||||
|
<h3>Ease-of-use</h3>
|
||||||
|
|
||||||
|
One persistent source of confusion for users of Boost.Python has been
|
||||||
|
the fact that conversions for a class are not be visible at
|
||||||
|
compile-time until the declaration of that class has been seen. When
|
||||||
|
the user tries to expose a (member) function operating on or returning
|
||||||
|
an instance of the class in question, compilation fails...even though
|
||||||
|
the user goes on to expose the class in the same translation unit!
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The new system lifts all compile-time checks for the existence of
|
||||||
|
particular type conversions and replaces them with runtime checks, in
|
||||||
|
true Pythonic style. While this might seem cavalier, the compile-time
|
||||||
|
checks are actually not much use in the current system if many classes
|
||||||
|
are wrapped in separate modules, since the checks are based only on
|
||||||
|
the user's declaration that the conversions exist.
|
||||||
|
|
||||||
|
<h2>The New Design</h2>
|
||||||
|
|
||||||
|
<h3>Motivation</h3>
|
||||||
|
|
||||||
|
The new design was heavily influenced by a desire to generate as
|
||||||
|
little code as possible in extension modules. Some of Boost.Python's
|
||||||
|
clients are enormous projects where link time is proportional to the
|
||||||
|
amount of object code, and there are many Python extension modules. As
|
||||||
|
such, we try to keep type-specific conversion code out of modules
|
||||||
|
other than the one the converters are defined in, and rely as much as
|
||||||
|
possible on centralized control through a shared library.
|
||||||
|
|
||||||
|
<h3>The Basics</h3>
|
||||||
|
|
||||||
|
The library contains a <tt>registry</tt> which maps runtime type
|
||||||
|
identifiers (actually an extension of <tt>std::type_info</tt> which
|
||||||
|
preserves references and constness) to entries containing type
|
||||||
|
converters. An <tt>entry</tt> can contain only one converter from C++ to Python
|
||||||
|
(<tt>wrapper</tt>), but many converters from Python to C++
|
||||||
|
(<tt>unwrapper</tt>s). <font color="#ff0000">What should happen if
|
||||||
|
multiple modules try to register wrappers for the same type?</font>. Wrappers
|
||||||
|
and unwrappers are known as <tt>body</tt> objects, and are accessed
|
||||||
|
by the user and the library (in its function-wrapping code) through
|
||||||
|
corresponding <tt>handle</tt> (<tt>wrap<T></tt> and
|
||||||
|
<tt>unwrap<T></tt>) objects. The <tt>handle</tt> objects are
|
||||||
|
extremely lightweight, and delegate <i>all</i> of their operations to
|
||||||
|
the corresponding <tt>body</tt>.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
When a <tt>handle</tt> object is constructed, it accesses the
|
||||||
|
registry to find a corresponding <tt>body</tt> that can convert the
|
||||||
|
handle's constructor argument. Actually the registry record for any
|
||||||
|
type
|
||||||
|
<tt>T</tt>used in a module is looked up only once and stored in a
|
||||||
|
static <tt>registration<T></tt> object for efficiency. For
|
||||||
|
example, if the handle is an <tt>unwrap<Foo&></tt> object,
|
||||||
|
the <tt>entry</tt> for <tt>Foo&</tt> is looked up in the
|
||||||
|
<tt>registry</tt>, and each <tt>unwrapper</tt> it contains is queried
|
||||||
|
to determine if it can convert the
|
||||||
|
<tt>PyObject*</tt> with which the <tt>unwrap</tt> was constructed. If
|
||||||
|
a body object which can perform the conversion is found, a pointer to
|
||||||
|
it is stored in the handle. A body object may at any point store
|
||||||
|
additional data in the handle to speed up the conversion process.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
Now that the handle has been constructed, the user can ask it whether
|
||||||
|
the conversion can be performed. All handles can be tested as though
|
||||||
|
they were convertible to <tt>bool</tt>; a <tt>true</tt> value
|
||||||
|
indicates success. If the user forges ahead and tries to do the
|
||||||
|
conversion without checking when no conversion is possible, an
|
||||||
|
exception will be thrown as usual. The conversion itself is performed
|
||||||
|
by the body object.
|
||||||
|
|
||||||
|
<h3>Handling complex conversions</h3>
|
||||||
|
|
||||||
|
<p>Some conversions may require a dynamic allocation. For example,
|
||||||
|
when a Python tuple is converted to a <tt>std::vector<double>
|
||||||
|
const&</tt>, we need some storage into which to construct the
|
||||||
|
vector so that a reference to it can be formed. Furthermore, multiple
|
||||||
|
conversions of the same type may need to be "active"
|
||||||
|
simultaneously, so we can't keep a single copy of the storage
|
||||||
|
anywhere. We could keep the storage in the <tt>body</tt> object, and
|
||||||
|
have the body clone itself in case the storage is used, but in that
|
||||||
|
case the storage in the body which lives in the registry is never
|
||||||
|
used. If the storage was actually an object of the target type (the
|
||||||
|
safest way in C++), we'd have to find a way to construct one for the
|
||||||
|
body in the registry, since it may not have a default constructor.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The most obvious way out of this quagmire is to allocate the object using a
|
||||||
|
<i>new-expression</i>, and store a pointer to it in the handle. Since
|
||||||
|
the <tt>body</tt> object knows everything about the data it needs to
|
||||||
|
allocate (if any), it is also given responsibility for destroying that
|
||||||
|
data. When the <tt>handle</tt> is destroyed it asks the <tt>body</tt>
|
||||||
|
object to tear down any data it may have stored there. In many ways,
|
||||||
|
you can think of the <tt>body</tt> as a "dynamically-determined
|
||||||
|
vtable" for the handle.
|
||||||
|
|
||||||
|
<h3>Eliminating Redundancy</h3>
|
||||||
|
|
||||||
|
If you look at the current Boost.Python code, you'll see that there
|
||||||
|
are an enormous number of conversion functions generated for each
|
||||||
|
wrapped class. For a given class <tt>T</tt>, functions are generated
|
||||||
|
to extract the following types <tt>from_python</tt>:
|
||||||
|
|
||||||
|
<blockquote><pre>
|
||||||
|
T*
|
||||||
|
T const*
|
||||||
|
T const* const&
|
||||||
|
T* const&
|
||||||
|
T&
|
||||||
|
T const&
|
||||||
|
T
|
||||||
|
std::auto_ptr<T>&
|
||||||
|
std::auto_ptr<T>
|
||||||
|
std::auto_ptr<T> const&
|
||||||
|
boost::shared_ptr<T>&
|
||||||
|
boost::shared_ptr<T>
|
||||||
|
boost::shared_ptr<T> const&
|
||||||
|
</pre></blockquote>
|
||||||
|
|
||||||
|
Most of these are implemented in terms of just a few conversions, and
|
||||||
|
<t>if you're lucky</t>, they will be inlined and cause no extra
|
||||||
|
overhead. In the new system, however, a significant amount of data
|
||||||
|
will be associated with each type that needs to be converted. We
|
||||||
|
certainly don't want to register a separate unwrapper object for all
|
||||||
|
of the above types.
|
||||||
|
|
||||||
|
<p>Fortunately, much of the redundancy can be eliminated. For example,
|
||||||
|
if we generate an unwrapper for <tt>T&</tt>, we don't need an
|
||||||
|
unwrapper for <tt>T const&</tt> or <tt>T</tt>. Accordingly, the user's
|
||||||
|
request to wrap/unwrap a given type is translated at compile-time into
|
||||||
|
a request which helps to eliminate redundancy. The rules used to
|
||||||
|
<tt>unwrap</tt> a type are:
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li> Treat built-in types specially: when unwrapping a value or
|
||||||
|
constant reference to one of these, use a value for the target
|
||||||
|
type. It will bind to a const reference if neccessary, and more
|
||||||
|
importantly, avoids having to dynamically allocate room for
|
||||||
|
an lvalue of types which can be cheaply copied.
|
||||||
|
<li>
|
||||||
|
Reduce everything else to a reference to an un-cv-qualified type
|
||||||
|
where possible. Since cv-qualification is lost on Python
|
||||||
|
anyway, there's no point in trying to convert to a
|
||||||
|
<tt>const&</tt>. <font color="#ff0000">What about conversions
|
||||||
|
to values like the tuple->vector example above? It seems to me
|
||||||
|
that we don't want to make a <tt>vector<double>&</tt>
|
||||||
|
(non-const) converter available for that case. We may need to
|
||||||
|
rethink this slightly.</font>
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<p>To handle the problem described above in item 2, we modify the
|
||||||
|
procedure slightly. To unwrap any non-scalar <tt>T</tt>, we seek an
|
||||||
|
unwrapper for <tt>add_reference<T>::type</tt>. Unwrappers for
|
||||||
|
<tt>T const&</tt> always return <tt>T&</tt>, and are
|
||||||
|
registered under both <tt>T &</tt> and
|
||||||
|
<tt>T const&</tt>.
|
||||||
|
|
||||||
|
<p>For compilers not supporting partial specialization, unwrappers for
|
||||||
|
<tt>T const&</tt> must return <tt>T const&</tt>
|
||||||
|
(since constness can't be stripped), but a separate unwrapper object
|
||||||
|
need to be registered for <tt>T &</tt> and
|
||||||
|
<tt>T const&</tt> anyway, for the same reasons.
|
||||||
|
|
||||||
|
<font color="#ff0000">We may want to make it possible to compile as
|
||||||
|
though partial specialization were unavailable even on compilers where
|
||||||
|
it is available, in case modules could be compiled by different
|
||||||
|
compilers with compatible ABIs (e.g. Intel C++ and MSVC6).</font>
|
||||||
|
|
||||||
|
<h3>Efficient Argument Conversion</h3>
|
||||||
|
|
||||||
|
Since type conversions are primarily used in function wrappers, an
|
||||||
|
optimization is provided for the case where a group of conversions are
|
||||||
|
used together. Each <tt>handle</tt> class has a corresponding
|
||||||
|
"<tt>_more</tt>" class which does the same job, but has a
|
||||||
|
trivial destructor. Instead of asking each "<tt>_more</tt>"
|
||||||
|
handle to destroy its own body, it is linked into an endogenous list
|
||||||
|
managed by the first (ordinary) handle. The <tt>wrap</tt> and
|
||||||
|
<tt>unwrap</tt> destructors are responsible for traversing that list
|
||||||
|
and asking each <tt>body</tt> class to tear down its
|
||||||
|
<tt>handle</tt>. This mechanism is also used to determine if all of
|
||||||
|
the argument/return-value conversions can succeed with a single
|
||||||
|
function call in the function wrapping code. <font color="#ff0000">We
|
||||||
|
might need to handle return values in a separate step for Python
|
||||||
|
callbacks, since the availablility of a conversion won't be known
|
||||||
|
until the result object is retrieved.</font>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
<hr>
|
||||||
|
<h2>References</h2>
|
||||||
|
|
||||||
|
<p><a name="ref_1">[1]</a>B. Stroustrup, The C++ Programming Language
|
||||||
|
Special Edition Addison-Wesley, ISBN 0-201-70073-5.
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<p>Revised <!--webbot bot="Timestamp" s-type="EDITED" s-format="%d %B %Y" startspan -->19 December 2001<!--webbot bot="Timestamp" endspan i-checksum="31283" --></p>
|
||||||
|
<p>© Copyright David Abrahams, 2001</p>
|
||||||
|
|
||||||
|
</body>
|
||||||
|
|
||||||
|
</html>
|
||||||
111
doc/new-conversions.txt
Normal file
111
doc/new-conversions.txt
Normal file
@@ -0,0 +1,111 @@
|
|||||||
|
This hierarchy contains converter handle classes.
|
||||||
|
|
||||||
|
|
||||||
|
+-------------+
|
||||||
|
| noncopyable |
|
||||||
|
+-------------+
|
||||||
|
^
|
||||||
|
| A common base class used so that
|
||||||
|
+--------+--------+ conversions can be linked into a
|
||||||
|
| conversion_base | chain for efficient argument
|
||||||
|
+-----------------+ conversion
|
||||||
|
^
|
||||||
|
|
|
||||||
|
+---------+-----------+
|
||||||
|
| |
|
||||||
|
+-----------+----+ +------+-------+ only used for
|
||||||
|
| unwrap_more<T> | | wrap_more<T> | chaining, and don't manage any
|
||||||
|
+----------------+ +--------------+ resources.
|
||||||
|
^ ^
|
||||||
|
| |
|
||||||
|
+-----+-----+ +-------+-+ These converters are what users
|
||||||
|
| unwrap<T> | | wrap<T> | actually touch, but they do so
|
||||||
|
+-----------+ +---------+ through a type generator which
|
||||||
|
minimizes the number of converters
|
||||||
|
that must be generated, so they
|
||||||
|
|
||||||
|
|
||||||
|
Each unwrap<T>, unwrap_more<T>, wrap<T>, wrap_more<T> converter holds
|
||||||
|
a reference to an appropriate converter object
|
||||||
|
|
||||||
|
This hierarchy contains converter body classes
|
||||||
|
|
||||||
|
Exposes use/release which
|
||||||
|
are needed in case the converter
|
||||||
|
+-----------+ in the registry needs to be
|
||||||
|
| converter | cloned. That occurs when a
|
||||||
|
+-----------+ unwrap target type is not
|
||||||
|
^ contained within the Python object.
|
||||||
|
|
|
||||||
|
+------------------+-----+
|
||||||
|
| |
|
||||||
|
+--------+-------+ Exposes |
|
||||||
|
| unwrapper_base | convertible() |
|
||||||
|
+----------------+ |
|
||||||
|
^ |
|
||||||
|
| |
|
||||||
|
+--------+----+ +-----+-----+
|
||||||
|
| unwrapper<T>| | wrapper<T>|
|
||||||
|
+-------------+ +-----------+
|
||||||
|
Exposes T convert(PyObject*) Exposes PyObject* convert(T)
|
||||||
|
|
||||||
|
|
||||||
|
unwrap:
|
||||||
|
|
||||||
|
constructed with a PyObject*, whose reference count is
|
||||||
|
incremented.
|
||||||
|
|
||||||
|
find the registry entry for the target type
|
||||||
|
|
||||||
|
look in the collection of converters for one which claims to be
|
||||||
|
able to convert the PyObject to the target type.
|
||||||
|
|
||||||
|
stick a pointer to the unwrapper in the unwrap object
|
||||||
|
|
||||||
|
when unwrap is queried for convertibility, it checks to see
|
||||||
|
if it has a pointer to an unwrapper.
|
||||||
|
|
||||||
|
on conversion, the unwrapper is asked to allocate an
|
||||||
|
implementation if the unwrap object isn't already holding
|
||||||
|
one. The unwrap object "takes ownership" of the unwrapper's
|
||||||
|
implementation. No memory allocation will actually take place
|
||||||
|
unless this is a value conversion.
|
||||||
|
|
||||||
|
on destruction, the unwrapper is asked to free any implementation
|
||||||
|
held by the unwrap object. No memory deallocation actually
|
||||||
|
takes place unless this is a value conversion
|
||||||
|
|
||||||
|
on destruction, the reference count on the held PyObject is
|
||||||
|
decremented.
|
||||||
|
|
||||||
|
We need to make sure that by default, you can't instantiate
|
||||||
|
callback<> for reference and pointer return types: although the
|
||||||
|
unwrappers may exist, they may convert by-value, which would cause
|
||||||
|
the referent to be destroyed upon return.
|
||||||
|
|
||||||
|
wrap:
|
||||||
|
|
||||||
|
find the registry entry for the source type
|
||||||
|
|
||||||
|
see if there is a converter. If found, stick a pointer to it in
|
||||||
|
the wrap object.
|
||||||
|
|
||||||
|
when queried for convertibility, it checks to see if it has a
|
||||||
|
pointer to a converter.
|
||||||
|
|
||||||
|
on conversion, a reference to the target PyObject is held by the
|
||||||
|
converter. Generally, the PyObject will have been created by the
|
||||||
|
converter, but in certain cases it may be a pre-existing object,
|
||||||
|
whose reference count will have been incremented.
|
||||||
|
|
||||||
|
when a wrap<T> x is used to return from a C++ function,
|
||||||
|
x.release() is returned so that x no longer holds a reference to
|
||||||
|
the PyObject when destroyed.
|
||||||
|
|
||||||
|
Otherwise, on destruction, any PyObject still held has its
|
||||||
|
reference-count decremented.
|
||||||
|
|
||||||
|
|
||||||
|
When a converter is created by the user, the appropriate element must
|
||||||
|
be added to the registry; when it is destroyed, it must be removed
|
||||||
|
from the registry.
|
||||||
@@ -151,16 +151,9 @@ struct baz_callback {
|
|||||||
|
|
||||||
BOOST_PYTHON_MODULE_INIT(foobar)
|
BOOST_PYTHON_MODULE_INIT(foobar)
|
||||||
{
|
{
|
||||||
try
|
boost::python::module_builder foobar("foobar");
|
||||||
{
|
boost::python::class_builder<baz,baz_callback> baz_class("baz");
|
||||||
boost::python::module_builder foobar("foobar");
|
baz_class.def(&baz::calls_pure, "calls_pure");
|
||||||
boost::python::class_builder<baz,baz_callback> baz_class("baz");
|
|
||||||
baz_class.def(&baz::calls_pure, "calls_pure");
|
|
||||||
}
|
|
||||||
catch(...)
|
|
||||||
{
|
|
||||||
boost::python::handle_exception(); // Deal with the exception for Python
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
</pre>
|
</pre>
|
||||||
</blockquote>
|
</blockquote>
|
||||||
|
|||||||
@@ -287,6 +287,35 @@ bignum_class.def(&rmod, "__rmod__");
|
|||||||
found first (be it ``<code>int</code>`` or ``<code>float</code>'') will be
|
found first (be it ``<code>int</code>`` or ``<code>float</code>'') will be
|
||||||
used for either of the two types.
|
used for either of the two types.
|
||||||
|
|
||||||
|
<h3><a name="inplace">Inplace Operators</a></h3>
|
||||||
|
<p>
|
||||||
|
Boost.Python can also be used to expose inplace numeric operations
|
||||||
|
(i.e., <code>+=</code> and so forth). These operators must be wrapped
|
||||||
|
manually, as described in the previous section. For example, suppose
|
||||||
|
the class BigNum has an <code>operator+=</code>:
|
||||||
|
|
||||||
|
<blockquote><pre>
|
||||||
|
BigNum& operator+= (BigNum const& right);
|
||||||
|
</pre></blockquote>
|
||||||
|
|
||||||
|
This can be exposed by first writing a wrapper function:
|
||||||
|
|
||||||
|
<blockquote><pre>
|
||||||
|
BigNum& iadd (BigNum& self, const BigNum& right)
|
||||||
|
{
|
||||||
|
return self += right;
|
||||||
|
}
|
||||||
|
</pre></blockquote>
|
||||||
|
|
||||||
|
and then exposing the wrapper with
|
||||||
|
|
||||||
|
<blockquote><pre>
|
||||||
|
bignum_class.def(&iadd, "__iadd__");
|
||||||
|
</pre></blockquote>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<h3><a name="coercion">Coercion</a></h3>
|
<h3><a name="coercion">Coercion</a></h3>
|
||||||
|
|
||||||
|
|
||||||
@@ -739,7 +768,7 @@ void throw_key_error_if_end(
|
|||||||
if (p == m.end())
|
if (p == m.end())
|
||||||
{
|
{
|
||||||
PyErr_SetObject(PyExc_KeyError, boost::python::converters::to_python(key));
|
PyErr_SetObject(PyExc_KeyError, boost::python::converters::to_python(key));
|
||||||
throw boost::python::error_already_set();
|
boost::python::throw_error_already_set();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -35,8 +35,7 @@
|
|||||||
"example1.html#world_class"><code>extension_class<T></code></a>
|
"example1.html#world_class"><code>extension_class<T></code></a>
|
||||||
template defines a whole raft of these conversions (for <code>T, T*,
|
template defines a whole raft of these conversions (for <code>T, T*,
|
||||||
T&, std::auto_ptr<T></code>, etc.), using the same inline
|
T&, std::auto_ptr<T></code>, etc.), using the same inline
|
||||||
friend function technique employed by <a href=
|
friend function technique employed by <a href="../../utility/operators.htm">the boost operators
|
||||||
"file:///c:/boost/site/libs/utility/operators.htm">the boost operators
|
|
||||||
library</a>.
|
library</a>.
|
||||||
<p>
|
<p>
|
||||||
Because the <code>to_python</code> and <code>from_python</code> functions
|
Because the <code>to_python</code> and <code>from_python</code> functions
|
||||||
|
|||||||
163
doc/v2/Apr2002.html
Normal file
163
doc/v2/Apr2002.html
Normal file
@@ -0,0 +1,163 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
<title>Boost.Python - April 2002 Progress Report</title>
|
||||||
|
</head>
|
||||||
|
<body link="#0000ff" vlink="#800080">
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
<h2 align="center">April 2002 Progress Report</h2>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
<h2>Contents</h2>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="#accomplishments">Accomplishments</a></dt>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="#arity">Arbitrary Arity Support</a></dt>
|
||||||
|
<dt><a href="#callbacks">New Callback Interface</a></dt>
|
||||||
|
<dt><a href="#policies">Call Policies for Construtors</a></dt>
|
||||||
|
<dt><a href="#bugs">Real Users, Real Bugs</a></dt>
|
||||||
|
<dt><a href="#insights">New Insights</a></dt>
|
||||||
|
<dt><a href="#v1">Boost.Python V1 Maintenance</a></dt>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#missing">What's Missing</a></dt>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="accomplishments">Accomplishments</a></h2>
|
||||||
|
|
||||||
|
April was a short month as far as Boost.Python was concerned, since
|
||||||
|
the spring ISO C++ Committee Meeting (and associated vacation)
|
||||||
|
occupied me for the 2nd half of the month. However, a suprising amount
|
||||||
|
of work got done...
|
||||||
|
|
||||||
|
<h3><a name="arity">Arbitrary Arity Support</a></h3>
|
||||||
|
|
||||||
|
I began using the <a
|
||||||
|
href="../../../preprocessor/doc/index.htm">Boost.Preprocessor</a>
|
||||||
|
metaprogramming library to generate support for functions and member
|
||||||
|
functions of arbitrary arity, which was, to say the least, quite an
|
||||||
|
adventure. The feedback cycle resulting from my foray into
|
||||||
|
Boost.Preprocessor resulted in several improvements to the library,
|
||||||
|
most notably in its documentation.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
Boost.Python now supports calls of up to 17 arguments on most
|
||||||
|
compilers. Because most EDG-based compilers have dismal preprocessor
|
||||||
|
performance, I had to "manually" expand the metaprograms for
|
||||||
|
arities from zero to fifteen arguments, and EDG-based compilers with
|
||||||
|
<code>__EDG_VERSION__ <= 245</code> only support 15
|
||||||
|
arguments by default. If some crazy program finds a need for more than
|
||||||
|
the default arity support, users can increase the base support by
|
||||||
|
setting the <code>BOOST_PYTHON_MAX_ARITY</code> preprocessor symbol.
|
||||||
|
|
||||||
|
<h3><a name="callbacks">New Callback Interface</a></h3>
|
||||||
|
|
||||||
|
I mentioned in <a href="Mar2002.html">last month's report</a> that I
|
||||||
|
wasn't pleased with the interface for the interface for calling into
|
||||||
|
Python, so now it has been redesigned. The new interface is outlined
|
||||||
|
in <a
|
||||||
|
href="http://mail.python.org/pipermail/c++-sig/2002-April/000953.html">this
|
||||||
|
message</a> (though the GCC 2.95.3 bugs have been fixed).
|
||||||
|
|
||||||
|
<h3><a name="policies">Call Policies for Constructors</a></h3>
|
||||||
|
|
||||||
|
On April 2nd, I <a
|
||||||
|
href="http://mail.python.org/pipermail/c++-sig/2002-April/000916.html">announced</a>
|
||||||
|
support for the use of call policies with constructors.
|
||||||
|
|
||||||
|
<h3><a name="bugs">Real Users, Real Bugs</a></h3>
|
||||||
|
|
||||||
|
At least two people outside of Kull began actually using Boost.Python
|
||||||
|
v2 in earnest this month. Peter Bienstman and Pearu Pearson both
|
||||||
|
provided valuable real-world bug reports that helped me to improve the
|
||||||
|
library's robustness.
|
||||||
|
|
||||||
|
<h3><a name="insights">New Insights</a></h3>
|
||||||
|
|
||||||
|
<a
|
||||||
|
href="http://mail.python.org/pipermail/c++-sig/2002-May/001010.html"
|
||||||
|
>Answering some of Pearu's questions</a> about explicitly converting
|
||||||
|
objects between Python and C++ actually led me to a new understanding
|
||||||
|
of the role of the current conversion facilities. In Boost.Python v1,
|
||||||
|
all conversions between Python and C++ were handled by a single family
|
||||||
|
of functions, called <code>to_python()</code> and
|
||||||
|
<code>from_python()</code>. Since the primary role of Boost.Python is
|
||||||
|
to wrap C++ functions in Python, I used these names for the first kind
|
||||||
|
of converters I needed: those that extract C++ objects to be used as
|
||||||
|
function arguments and which C++ function return values to
|
||||||
|
Python. The better-considered approach in Boost.Python v2 uses a
|
||||||
|
completely different mechanism for conversions used when calling
|
||||||
|
Python from C++, as in wrapped virtual function implementations. I
|
||||||
|
usually think of this as a "callback", as in "calling
|
||||||
|
back into Python", and I named the converters used in callbacks
|
||||||
|
accordingly: <code>to_python_callback</code> and
|
||||||
|
<code>from_python_callback</code>. However, as it turns out, the
|
||||||
|
behavior of the "callback" converters is the appropriate one
|
||||||
|
for users who want to explicitly extract a C++ value from a Python
|
||||||
|
object, or create a Python object from a C++ value. The upshot is that
|
||||||
|
it probably makes sense to change the name of the existing <code>to_python</code> and
|
||||||
|
<code>from_python</code> so those names are available for the
|
||||||
|
user-friendly explicit converters.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<a
|
||||||
|
href="http://mail.python.org/pipermail/c++-sig/2002-May/001013.html">Another
|
||||||
|
of Pearu's questions</a> pushes momentum further in the direction of a
|
||||||
|
more-sophisticated overloading mechanism than the current
|
||||||
|
simple-minded "first match" approach, as I suggested <a
|
||||||
|
href="Mar2002.html#implicit_conversions">last month</a>.
|
||||||
|
|
||||||
|
<h3><a name="v1">Boost.Python V1 Maintenance</a></h3>
|
||||||
|
|
||||||
|
As much as I'm looking forward to retiring Boost.Python v1, a
|
||||||
|
significant amount of effort has been being spent dealing with support
|
||||||
|
problems; the saying that code rots when left alone is true, and
|
||||||
|
Boost.Python is no exception. Eventually it became obvious to me that
|
||||||
|
we were going to have to invest some effort in keeping V1 healthy
|
||||||
|
while working on V2. Ralf and I have expanded support for various
|
||||||
|
compilers and stabilized the V1 codebase considerably. We discarded
|
||||||
|
the obsolete Visual Studio projects which were causing so much
|
||||||
|
confusion. Still to do before the next Boost release:
|
||||||
|
<ol>
|
||||||
|
<li>Update the build/test documentation with detailed instructions for
|
||||||
|
configuring various toolsets.
|
||||||
|
<li>Provide some links to Boost.Python v2 to let people know what's
|
||||||
|
coming.
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
|
||||||
|
<h2><a name="missing">What's Missing</a></h2>
|
||||||
|
|
||||||
|
Last month I announced that I would implement the following which are
|
||||||
|
not yet complete:
|
||||||
|
<ol>
|
||||||
|
<li>Document all implemented features
|
||||||
|
<li>Implement conversions for <code>char</code> types. This is
|
||||||
|
implemented but not tested, so we have to assume it doesn't work.
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
These are my first priority for this month (especially the
|
||||||
|
documentation).
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
3 May, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
</p>
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave Abrahams</a>
|
||||||
|
2002. All Rights Reserved.</i></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
124
doc/v2/CallPolicies.html
Normal file
124
doc/v2/CallPolicies.html
Normal file
@@ -0,0 +1,124 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../../../boost.css">
|
||||||
|
<title>Boost.Python - CallPolicies Concept</title>
|
||||||
|
</head>
|
||||||
|
<body link="#0000ff" vlink="#800080">
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt="C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
<h2 align="center">CallPolicies Concept</h2>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a></dt>
|
||||||
|
<dt><a href="#composition">CallPolicies Composition</a></dt>
|
||||||
|
<dt><a href="#concept-requirements">Concept Requirements</a></dt>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#CallPolicies-concept">CallPolicies Concept</a></dt>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<p>Models of the CallPolicies concept are used to specialize the
|
||||||
|
behavior of Python callable objects generated by Boost.Python to
|
||||||
|
wrapped C++ objects like function and member function
|
||||||
|
pointers, providing three behaviors:
|
||||||
|
<ol>
|
||||||
|
<li> <code>precall</code> - Python argument tuple management before
|
||||||
|
the wrapped object is invoked
|
||||||
|
<li> <code>result_converter</code> - C++ return value handling
|
||||||
|
<li> <code>postcall</code> - Python argument tuple and result
|
||||||
|
management after the wrapped object is invoked
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h2><a name="composition"></a>CallPolicies Composition</h2>
|
||||||
|
|
||||||
|
In order to allow the use of multiple models of CallPolicies in the
|
||||||
|
same callable object, Boost.Python's CallPolicies class templates
|
||||||
|
provide a chaining interface which allows them to be recursively
|
||||||
|
composed. This interface takes the form of an optional template
|
||||||
|
parameter, <code>Base</code> which defaults to <a
|
||||||
|
href="default_call_policies.html#default_call_policies-spec">
|
||||||
|
<code>default_call_policies</code></a>. By convention, the
|
||||||
|
<code>precall</code> function of the
|
||||||
|
<code>Base</code> is invoked <i>after</i> the <code>precall</code>
|
||||||
|
function supplied by the outer template, and the <code>postcall</code>
|
||||||
|
function of the <code>Base</code> is invoked <i>before</i> the
|
||||||
|
<code>postcall</code> function of the outer template. If a
|
||||||
|
<code>result_converter</code> is supplied by the outer template, it
|
||||||
|
<i>replaces</i> any <code>result_converter</code> supplied by the
|
||||||
|
<code>Base</code>. For an example, see <a
|
||||||
|
href="return_internal_reference.html#return_internal_reference-spec">
|
||||||
|
<code>return_internal_reference</code></a>.
|
||||||
|
|
||||||
|
<h2><a name="concept-requirements"></a>Concept Requirements</h2>
|
||||||
|
<h3><a name="CallPolicies-concept"></a>CallPolicies Concept</h3>
|
||||||
|
|
||||||
|
<p>In the table below, <code><b>x</b></code> denotes an object whose
|
||||||
|
type <code><b>P</b></code> is a model of CallPolicies,
|
||||||
|
<code><b>a</b></code> denotes a <code>PyObject*</code> pointing to
|
||||||
|
a Python argument tuple object, and <code><b>r</b></code> denotes a
|
||||||
|
<code>PyObject*</code> referring to a "preliminary" result
|
||||||
|
object.
|
||||||
|
|
||||||
|
<table summary="CallPolicies expressions" border="1" cellpadding="5">
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><b>Expression</b></td>
|
||||||
|
<td><b>Type</b></td>
|
||||||
|
<td><b>Result/Semantics</b></td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td valign="top"><code>x.precall(a)</code></td>
|
||||||
|
<td>convertible to <code>bool</code>
|
||||||
|
<td>returns <code>false</code> and <code><a
|
||||||
|
href="http://www.python.org/doc/2.2/api/exceptionHandling.html#l2h-71">PyErr_Occurred</a>() != 0</code>
|
||||||
|
upon failure, <code>true</code> otherwise.
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td valign="top"><code>P::result_converter</code></td>
|
||||||
|
<td>A model of <a href="ResultConverter.html#ResultConverterGenerator-concept">ResultConverterGenerator</a>.
|
||||||
|
<td>An MPL unarymetafunction object used produce the
|
||||||
|
"preliminary" result object.
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td valign="top"><code>x.postcall(a, r)</code></td>
|
||||||
|
<td>convertible to <code>PyObject*</code>
|
||||||
|
<td>0 <code>0</code> and <code><a
|
||||||
|
href="http://www.python.org/doc/2.2/api/exceptionHandling.html#l2h-71">PyErr_Occurred</a>() != 0</code>
|
||||||
|
upon failure. Must "conserve references" even in the
|
||||||
|
event of an exception. In other words, if <code>r</code> is not
|
||||||
|
returned, its reference count must be decremented; if another
|
||||||
|
existing object is returned, its reference count must be
|
||||||
|
incremented.
|
||||||
|
</table>
|
||||||
|
|
||||||
|
Models of CallPolicies are required to be <a
|
||||||
|
href="../../../utility/CopyConstructible.html">CopyConstructible</a>.
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
19 May, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
</p>
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
|
<p>Permission to copy, use, modify, sell
|
||||||
|
and distribute this software is granted provided this copyright notice appears
|
||||||
|
in all copies. This software is provided "as is" without express or implied
|
||||||
|
warranty, and with no claim as to its suitability for any purpose.
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
66
doc/v2/Dereferenceable.html
Normal file
66
doc/v2/Dereferenceable.html
Normal file
@@ -0,0 +1,66 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../../../boost.css">
|
||||||
|
<title>Boost.Python - Dereferenceable Concept</title>
|
||||||
|
</head>
|
||||||
|
<body link="#0000ff" vlink="#800080">
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt="C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
<h2 align="center">Dereferenceable Concept</h2>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a></dt>
|
||||||
|
<dt><a href="#concept-requirements">Concept Requirements</a></dt>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#Dereferenceable-concept">Dereferenceable Concept</a></dt>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<p>Instances of a dereferenceable type can be used like a pointer to access an lvalue.
|
||||||
|
|
||||||
|
<h2><a name="concept-requirements"></a>Concept Requirements</h2>
|
||||||
|
<h3><a name="Dereferenceable-concept"></a>Dereferenceable Concept</h3>
|
||||||
|
|
||||||
|
<p>In the table below, <code><b>x</b></code> denotes an object whose
|
||||||
|
type is a model of Dereferenceable.
|
||||||
|
|
||||||
|
<table summary="Dereferenceable expressions" border="1" cellpadding="5">
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><b>Expression</b></td>
|
||||||
|
<td><b>Requirements</b></td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td valign="top"><code>*x</code></td>
|
||||||
|
<td>An lvalue
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
10 May, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
</p>
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
|
<p>Permission to copy, use, modify, sell
|
||||||
|
and distribute this software is granted provided this copyright notice appears
|
||||||
|
in all copies. This software is provided "as is" without express or implied
|
||||||
|
warranty, and with no claim as to its suitability for any purpose.
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
93
doc/v2/Extractor.html
Executable file
93
doc/v2/Extractor.html
Executable file
@@ -0,0 +1,93 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../../../boost.css">
|
||||||
|
<title>Boost.Python - Extractor Concept</title>
|
||||||
|
</head>
|
||||||
|
<body link="#0000ff" vlink="#800080">
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt="C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
<h2 align="center">Extractor Concept</h2>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a></dt>
|
||||||
|
<dt><a href="#concept-requirements">Concept Requirements</a></dt>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#Extractor-concept">Extractor Concept</a></dt>
|
||||||
|
</dl>
|
||||||
|
<dt><a href="#notes">Notes</a></dt>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<p>An Extractor is a class which Boost.Python can use to extract C++
|
||||||
|
objects from Python objects, and is typically used by facilities that
|
||||||
|
define <code>from_python</code> conversions for
|
||||||
|
"traditional" Python extension types.
|
||||||
|
|
||||||
|
<h2><a name="concept-requirements"></a>Concept Requirements</h2>
|
||||||
|
<h3><a name="Extractor-concept"></a>Extractor Concept</h3>
|
||||||
|
|
||||||
|
<p>In the table below, <code><b>X</b></code> denotes a model of
|
||||||
|
Extractor and <code><b>a</b></code> denotes an instance of a Python
|
||||||
|
object type.
|
||||||
|
|
||||||
|
<table summary="Extractor expressions" border="1" cellpadding="5">
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><b>Expression</b></td>
|
||||||
|
<td><b>Type</b></td>
|
||||||
|
<td><b>Semantics</b></td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td valign="top"><code>X::execute(a)</code></td>
|
||||||
|
<td>non-void
|
||||||
|
<td>Returns the C++ object being extracted. The
|
||||||
|
<code>execute</code> function must not be overloaded.
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td valign="top"><code>&a.ob_type</code>
|
||||||
|
<td><code><a
|
||||||
|
href="http://www.python.org/doc/2.2/ext/dnt-type-methods.html">PyTypeObject</a>**</code>
|
||||||
|
<td>Points to the <code>ob_type</code> field of an object which is
|
||||||
|
layout-compatible with <code>PyObject</code>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h2><a name="notes"></a>Notes</h2>
|
||||||
|
|
||||||
|
Informally, an Extractor's <code>execute</code> member must be a
|
||||||
|
non-overloaded static function whose single argument is a Python
|
||||||
|
object type. Acceptable Python object types include those publicly (and
|
||||||
|
unambiguously) derived from <code>PyObject</code>, and POD types which
|
||||||
|
are layout-compatible with PyObject.
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
22 May, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
</p>
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
|
<p>Permission to copy, use, modify, sell
|
||||||
|
and distribute this software is granted provided this copyright notice appears
|
||||||
|
in all copies. This software is provided "as is" without express or implied
|
||||||
|
warranty, and with no claim as to its suitability for any purpose.
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
71
doc/v2/HolderGenerator.html
Executable file
71
doc/v2/HolderGenerator.html
Executable file
@@ -0,0 +1,71 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../../../boost.css">
|
||||||
|
<title>Boost.Python - Holder Concept</title>
|
||||||
|
</head>
|
||||||
|
<body link="#0000ff" vlink="#800080">
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt="C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
<h2 align="center">HolderGenerator Concept</h2>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a></dt>
|
||||||
|
<dt><a href="#concept-requirements">Concept Requirements</a></dt>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#HolderGenerator-concept">HolderGenerator Concept</a></dt>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<p>A HolderGenerator is a unary metafunction class which returns types
|
||||||
|
suitable for holding instances of its argument in a wrapped C++ class
|
||||||
|
instance.
|
||||||
|
|
||||||
|
<h2><a name="concept-requirements"></a>Concept Requirements</h2>
|
||||||
|
<h3><a name="HolderGenerator-concept"></a>HolderGenerator Concept</h3>
|
||||||
|
|
||||||
|
<p>In the table below, <code><b>G</b></code> denotes an type which
|
||||||
|
models HolderGenerator, and <code><b>X</b></code> denotes a class
|
||||||
|
type.
|
||||||
|
|
||||||
|
<table summary="Holder expressions" border="1" cellpadding="5">
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><b>Expression</b></td>
|
||||||
|
<td><b>Requirements</b></td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td valign="top"><code>G::apply<X>::type</code></td>
|
||||||
|
<td>A concrete subclass of <a
|
||||||
|
href="instance_holder.html#instance_holder-spec">instance_holder</a>
|
||||||
|
which can hold objects of type <code>X</code>.
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
20 May, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
</p>
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
|
<p>Permission to copy, use, modify, sell
|
||||||
|
and distribute this software is granted provided this copyright notice appears
|
||||||
|
in all copies. This software is provided "as is" without express or implied
|
||||||
|
warranty, and with no claim as to its suitability for any purpose.
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
226
doc/v2/Jun2002.html
Normal file
226
doc/v2/Jun2002.html
Normal file
@@ -0,0 +1,226 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
<title>Boost.Python - June 2002 Progress Report</title>
|
||||||
|
</head>
|
||||||
|
<body link="#0000ff" vlink="#800080">
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
<h2 align="center">June 2002 Progress Report</h2>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
<h2>Contents</h2>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="#intro">Introduction</a></dt>
|
||||||
|
<dt><a href="#handle"><code>handle<T></code></a></dt>
|
||||||
|
<dt><a href="#object"><code>object</code></a></dt>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="#operators"><code>object</code> operators</a></dt>
|
||||||
|
<dt><a href="#conversions"><code>object</code> conversions</a></dt>
|
||||||
|
</dl>
|
||||||
|
<dt><a href="#list"><code>list</code></a></dt>
|
||||||
|
<dt><a href="#numerics"><code>Numerics</code></a></dt>
|
||||||
|
<dt><a href="#community">Community</a></dt>
|
||||||
|
<dt><a href="#next">What's Next</a></dt>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="intro">Introduction</a></h2>
|
||||||
|
|
||||||
|
July was mostly focused on allowing expressive manipulation of
|
||||||
|
individual Python objects, or what Ralf Grosse-Kunstleve calls
|
||||||
|
"Writing Python in C++". The work began with this <a
|
||||||
|
href="http://mail.python.org/pipermail/c++-sig/2002-June/001311.html">posting</a>,
|
||||||
|
which outlines the issues and intention.
|
||||||
|
|
||||||
|
<h2><a name="handle"><code>handle<T></code></a></h2>
|
||||||
|
|
||||||
|
The most basic element needed was a replacement for the
|
||||||
|
<code>reference<></code> class template and the
|
||||||
|
<code>ref</code> typedef from Boost.Python v1, a simple smart
|
||||||
|
pointer to a Python object. The old v1 typedef
|
||||||
|
"<code>ref</code>" (for
|
||||||
|
<code>reference<PyObject></code>) had to be retired because I
|
||||||
|
thought it would be too confusing given the importance of <code><a
|
||||||
|
href="../../../bind/ref.html">boost::ref</a>()</code> to this
|
||||||
|
library. I began a <a
|
||||||
|
href="http://mail.python.org/pipermail/c++-sig/2002-June/001311.html">discussion</a>of
|
||||||
|
possible names, and it was eventually <a
|
||||||
|
href="http://mail.python.org/pipermail/c++-sig/2002-June/001337.html">decided</a>
|
||||||
|
to rename <code>reference</code> to <code>handle</code> and supply a
|
||||||
|
default argument so that <code>ref</code> could be spelled
|
||||||
|
<code>handle<></code> without an additional typedef. There
|
||||||
|
were also some interface changes to make it safer and more-efficient
|
||||||
|
to interface with the raw
|
||||||
|
<code>PyObject*</code>s forced on us by Python's 'C' API. A
|
||||||
|
discussion of those protocols can be found <a
|
||||||
|
href="http://mail.python.org/pipermail/c++-sig/2002-June/001401.html">here</a>.
|
||||||
|
|
||||||
|
<h2><a name="handle"><code>object</code></a></h2>
|
||||||
|
|
||||||
|
It is intended that users will seldom need or want to work with
|
||||||
|
<code>handle<></code>; its major distinguishing features are
|
||||||
|
that it gives direct access to the underlying object representation
|
||||||
|
through <code>operator*</code> and <code>operator-></code>, and
|
||||||
|
that can be <code>NULL</code>, both sources of danger. Instead the
|
||||||
|
library provides a class called <code>object</code>, which
|
||||||
|
encapsulates a valid Python object and provides a similar interface to
|
||||||
|
Python's.
|
||||||
|
|
||||||
|
<h3><a name="operators"><code>object</code> operators</a></h3>
|
||||||
|
|
||||||
|
The first challenge was to provide support for object manipulations
|
||||||
|
using a Python-like syntax, mostly in the form of operator overloads:
|
||||||
|
|
||||||
|
<table border="1">
|
||||||
|
<tr><th>Python <th>C++
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>y = x.foo</code> <td><code>y = x.attr("foo");
|
||||||
|
<tr>
|
||||||
|
<td><code>x.foo = 1</code> <td><code>x.attr("foo") = 1;
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>y = x[z]</code> <td><code>y = x[z];
|
||||||
|
<tr>
|
||||||
|
<td><code>x[z] = 1</code> <td><code>x[z] = 1;
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>y = x[3:-1]</code> <td><code>y = x.slice(3,-1);
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>y = x[3:]</code> <td><code>y = x.slice(3,_);
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>y = x[:-2]</code> <td><code>y = x.slice(_,-2);
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>z = x(1, y)</code> <td><code>z = x(1, y);
|
||||||
|
<tr>
|
||||||
|
<td><code>z = x.f(1, y)</code> <td><code>z = x.attr("f")(1, y);
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>not x</code> <td><code>!x
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>x and y</code> <td><code>x and y
|
||||||
|
</table>
|
||||||
|
|
||||||
|
I'm still a unsatisfied with the interface for attribute access. There
|
||||||
|
original proposal used a syntax like this one:
|
||||||
|
<pre>
|
||||||
|
y = x._("foo");
|
||||||
|
x._("foo") = 1;
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
which was only marginally better than what we've got. Niki Spahiev
|
||||||
|
then <a
|
||||||
|
href="http://mail.python.org/pipermail/c++-sig/2002-June/001447.html">pointed
|
||||||
|
out</a> a potential conflict with the macro which GNU Gettext <a
|
||||||
|
href="http://www.gnu.org/manual/gettext/html_mono/gettext.html#SEC6">suggests</a>
|
||||||
|
people define. This unfortunate state of affairs forced us into using
|
||||||
|
<code>attr</code> instead. I'd still like to find a better interface,
|
||||||
|
but the lack of overloadable C++ operators which aren't already used
|
||||||
|
in Python is an obstacle. The comma operator is still a possibility,
|
||||||
|
but it has the wrong precedence:
|
||||||
|
<pre>
|
||||||
|
y = x,"foo" // error
|
||||||
|
x,"foo" = 1; // error
|
||||||
|
|
||||||
|
y = (x,"foo"); // ok
|
||||||
|
(x,"foo") = 1; // ok
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
Well, I guess we could consider adding that to the interface without
|
||||||
|
removing <code>attr()</code>, to see how it plays out...
|
||||||
|
|
||||||
|
<h3><a name="operators"><code>object</code> conversions</a></h3>
|
||||||
|
|
||||||
|
The <code>object</code> class also provided an opportunity to replace
|
||||||
|
Boost.Python v1's <code>to_python()</code> as a user-level
|
||||||
|
interface. Instead, <code>object</code> has a templated constructor
|
||||||
|
which can be used to convert any C++ object to Python using the same
|
||||||
|
underlying mechanisms used for the arguments to <code><a
|
||||||
|
href="call.html">call</a><></code>.
|
||||||
|
|
||||||
|
<p>Incidentally, the implementation of operator and conversion support
|
||||||
|
for object uncovered an inordinate number of compiler bugs in our
|
||||||
|
targeted platforms. It was a lot more "interesting" than it
|
||||||
|
should have been.
|
||||||
|
|
||||||
|
<h2><a name="list"><code>list</code></a></h2>
|
||||||
|
|
||||||
|
With <code>object</code> implemented, it was time to begin replacing
|
||||||
|
the ad-hoc implementations of <code>list</code>, <code>string</code>,
|
||||||
|
and <code>dictionary</code> supplied by Boost.Python v1 with something
|
||||||
|
more robust. I started with <code>list</code> as an example. Because
|
||||||
|
<code>object</code> already provides all of the requisite operators,
|
||||||
|
publicly deriving <code>list</code> from object seemed like a good
|
||||||
|
choice. The remaining issues were what do do about the one-argument
|
||||||
|
list constructor (which in Python attempts to convert its argument to
|
||||||
|
a list), and how to deal converting with <code>list</code> arguments
|
||||||
|
to wrapped functions. Some of the issues are laid out in <a
|
||||||
|
href="http://mail.python.org/pipermail/c++-sig/2002-June/001551.html">this
|
||||||
|
thread</a>. Ultimately, it was decided that <code>list(x)</code>
|
||||||
|
should do the same thing in C++ as in Python (conversion), while
|
||||||
|
<code>list</code> arguments should only match Python
|
||||||
|
<code>list</code>s (and <code>list</code> subclasses). The
|
||||||
|
implementation worked well, and provided a <a
|
||||||
|
href="http://mail.python.org/pipermail/c++-sig/2002-June/001586.html">roadmap</a>
|
||||||
|
for the protocol to be used for implementation of the other built-in
|
||||||
|
types.
|
||||||
|
|
||||||
|
<h2><a name="numerics">Numerics</a></h2>
|
||||||
|
|
||||||
|
Support for C++ <code>long long</code> and <code>unsigned long
|
||||||
|
long</code>
|
||||||
|
(and <code>__int64</code> on MSVC) to/from python conversions was
|
||||||
|
added this month. We also improved handling of numeric overflows when
|
||||||
|
converting, e.g., a Python int to a type with a more limited range of
|
||||||
|
representation.
|
||||||
|
|
||||||
|
<h2><a name="community">Community</a></h2>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Ralf W. Grosse-Kunstleve and Nick Sauter have implemented
|
||||||
|
<a href="http://cci.lbl.gov/boost/">multiplatform nightly
|
||||||
|
build-and-test</a> runs for Boost.Python V2 at LBL.
|
||||||
|
|
||||||
|
<li>Dave Hawkes has made significant progress on generating the
|
||||||
|
Python <a
|
||||||
|
href="http://mail.python.org/pipermail/c++-sig/2002-June/001503.html">built-in
|
||||||
|
function and API wrappers</a>
|
||||||
|
|
||||||
|
<li>Achim Domma has agreed to take up the job of implementing the
|
||||||
|
<code>str</code>, <code>dict</code>, and <code>tuple</code> classes.
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
Deep thanks to all the Boost.Python contributors! This project
|
||||||
|
wouldn't be possible without your participation.
|
||||||
|
|
||||||
|
<h2><a name="next">What's Next</a></h2>
|
||||||
|
|
||||||
|
As I write this we are already well into the month of July, so I
|
||||||
|
suggest you consult the <a
|
||||||
|
href="http://mail.python.org/pipermail/c++-sig/2002-July/">Mailing
|
||||||
|
List Archive</a> if you want to know what's been happening. Otherwise
|
||||||
|
you'll just have to wait till next month (hopefully the beginning).
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
19 July, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
</p>
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave Abrahams</a>
|
||||||
|
2002. All Rights Reserved.</i></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
234
doc/v2/Mar2002.html
Normal file
234
doc/v2/Mar2002.html
Normal file
@@ -0,0 +1,234 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
<title>Boost.Python - March 2002 Progress Report</title>
|
||||||
|
</head>
|
||||||
|
<body link="#0000ff" vlink="#800080">
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
<h2 align="center">March 2002 Progress Report</h2>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
<h2>Contents</h2>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="#accomplishments">Accomplishments</a></dt>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="#calling_python">Calling Python from C++</a></dt>
|
||||||
|
<dt><a href="#virtual_functions">Virtual Functions</a></dt>
|
||||||
|
<dt><a href="#abstract_classes">Abstract Classes</a></dt>
|
||||||
|
<dt><a href="#implicit_conversions">C++ Implicit Conversions</a></dt>
|
||||||
|
<dt><a href="#data_members">C++ Data Members</a></dt>
|
||||||
|
<dt><a href="#miscellaneous">Miscellaneous</a></dt>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#future">The Near future</a></dt>
|
||||||
|
|
||||||
|
<dt><a href="#notes">Notes</a></dt>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="accomplishments">Accomplishments</a></h2>
|
||||||
|
|
||||||
|
March was mostly devoted to the reimplementation of features from
|
||||||
|
Boost.Python v1, and some new features. Re-examination of the features
|
||||||
|
from Boost.Python v1 allowed me to make significant improvements.
|
||||||
|
|
||||||
|
<h3><a name="calling_python">Calling Python from C++</a></h3>
|
||||||
|
|
||||||
|
The ability to call Python from C++ is crucial for virtual function
|
||||||
|
support. Implementing this feature well for V2 proved to be more
|
||||||
|
interesting than I expected. You can review most of the relevant
|
||||||
|
design decisions
|
||||||
|
<a href="callbacks.txt">here</a>.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
One point which <i>isn't</i> emphasized in that document is that there
|
||||||
|
are subtle differences in the way <code>from_python</code> conversions
|
||||||
|
work when used for C++ function arguments and Python function return
|
||||||
|
values. In particular, while <code>T const&</code> arguments may
|
||||||
|
invoke rvalue converters, a reference-to-const return value requires
|
||||||
|
an lvalue converter, since a temporary conversion result would leave
|
||||||
|
the returned reference dangling.
|
||||||
|
|
||||||
|
<p>I'm not particularly pleased with the current callback interface,
|
||||||
|
since it usually results in constructs like:
|
||||||
|
<pre>
|
||||||
|
<u>return returning</u><X&>::call(f, obj);
|
||||||
|
</pre>
|
||||||
|
However, I think the following may be possible and I plan to investigate:
|
||||||
|
<pre>
|
||||||
|
return apply<X&>(f, obj);
|
||||||
|
</pre>
|
||||||
|
I'm open to suggestion for better names (and syntaxes)!
|
||||||
|
|
||||||
|
<h3><a name="virtual_functions">Virtual Functions</a></h3>
|
||||||
|
|
||||||
|
Once Python callbacks were implemented, it was just a short step to
|
||||||
|
implementing virtual functions. Python extension class exposing a C++
|
||||||
|
class whose virtual functions are overridable in Python must actually
|
||||||
|
hold a C++ instance of a class <i>derived</i> from the one exposed to
|
||||||
|
Python. Needing some way for users to specify that class, I added an
|
||||||
|
optional template argument to <code>value_holder_generator</code> and
|
||||||
|
<code>pointer_holder_generator<></code> to specify the class
|
||||||
|
actually held. This move began to put pressure on the
|
||||||
|
<code>class_<></code> interface, since the need for the user to
|
||||||
|
produce complicated instantations of
|
||||||
|
<code>class_<></code> was increased:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
class<Foo, bases<>, value_holder_generator<Foo_callback> >("Foo")
|
||||||
|
.def("hello", &Foo::hello)
|
||||||
|
...
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h3><a name="abstract_classes">Abstract Classes</a></h3>
|
||||||
|
|
||||||
|
Normally when a C++ class is exposed to Python, the library registers
|
||||||
|
a conversion function which allows users to wrap functions returning
|
||||||
|
values of that type. Naturally, these return values are temporaries,
|
||||||
|
so the conversion function must make a copy in some
|
||||||
|
dynamically-allocated storage (a "holder") which is managed
|
||||||
|
by the corresponding Python object.
|
||||||
|
|
||||||
|
<p>Unfortunately, in the case of abstract classes (and other types
|
||||||
|
without a publicly-accessible copy constructor), instantiating this
|
||||||
|
conversion function causes a compilation error. In order to support
|
||||||
|
non-copyable classes, there had to be some way to prevent the library
|
||||||
|
from trying to instantiate the conversion function. The only practical
|
||||||
|
approach I could think of was to add an additional template parameter
|
||||||
|
to the <code>class_<></code> interface. When the number of
|
||||||
|
template parameters with useful defaults begins to grow, it is often
|
||||||
|
hard to choose an order which allows users to take advantage of the
|
||||||
|
defaults.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
This was the straw that broke the
|
||||||
|
<code>class_<></code> interface's back and caused the redesign
|
||||||
|
whose outcome is detailed <a
|
||||||
|
href="http://mail.python.org/pipermail/c++-sig/2002-March/000892.html">here</a>.
|
||||||
|
The approach allows the user to supply the optional parameters in an
|
||||||
|
arbitrary order. It was inspired by the use of <a
|
||||||
|
href="../../../utility/iterator_adaptors.htm#named_tempalte_parameters">named
|
||||||
|
template parameters</a> in the <a
|
||||||
|
href="../../../utility/iterator_adaptors.htm">Boost Iterator Adaptor
|
||||||
|
Library</a>, though in this case it is possible to deduce the meaning
|
||||||
|
of the template parameters entirely from their type properties,
|
||||||
|
resulting in a simpler interface. Although the move from a
|
||||||
|
policy-based design to what resembles a configuration DSL usually
|
||||||
|
implies a loss of flexibility, in this case I think any costs are far
|
||||||
|
outweighed by the advantages.
|
||||||
|
|
||||||
|
<p>Note: working around the limitations of the various compilers I'm
|
||||||
|
supporting was non-trivial, and resulted in a few messy implementation
|
||||||
|
details. It might be a good idea to switch to a more-straightforward
|
||||||
|
approach once Metrowerks CodeWarrior Pro8 is released.
|
||||||
|
|
||||||
|
<h3><a name="implicit_conversions">C++ Implicit Conversions</a></h3>
|
||||||
|
|
||||||
|
Support for C++ implicit conversion involves creating
|
||||||
|
<code>from_python</code> converters for a type <code>U</code> which in
|
||||||
|
turn use <code>from_python</code> converters registered for a type
|
||||||
|
<code>T</code> where there exists a implicit conversion from
|
||||||
|
<code>T</code> to <code>U</code>. The current implementation is
|
||||||
|
subject to two inefficiencies:
|
||||||
|
<ol>
|
||||||
|
|
||||||
|
<li>Because an rvalue <code>from_python</code> converter produces two
|
||||||
|
pieces of data (a function and a <code>void*</code>) from its
|
||||||
|
<code>convertible()</code> function, we end up calling the function
|
||||||
|
for <code>T</code> twice: once when the converter is looked up in the
|
||||||
|
registry, and again when the conversion is actually performed.
|
||||||
|
|
||||||
|
<li>A vector is used to mark the "visited" converters, preventing
|
||||||
|
infinite recursion as <code>T</code> to
|
||||||
|
<code>U</code> and <code>U</code> to <code>T</code> converters
|
||||||
|
continually search through one-another.
|
||||||
|
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
I consider the former to be a minor issue. The second may or may not
|
||||||
|
prove to be computationally significant, but I believe that
|
||||||
|
architecturally, it points toward a need for more sophisticated
|
||||||
|
overload resolution. It may be that we want CLOS-style multimethod
|
||||||
|
dispatching along with C++ style rules that prevent more than one
|
||||||
|
implicit conversion per argument.
|
||||||
|
|
||||||
|
<h3><a name="data_members">C++ Data Members</a></h3>
|
||||||
|
|
||||||
|
To supply the ability to directly access data members, I was able to
|
||||||
|
hijack the new Python <a
|
||||||
|
href="http://www.python.org/2.2/descrintro.html#property">property</a>
|
||||||
|
type. I had hoped that I would also be able to re-use the work of <a
|
||||||
|
href="make_function.html">make_function</a> to create callable python
|
||||||
|
objects from C++ functions which access a data member of a given
|
||||||
|
class. C++ facilities for specifying data member pointer non-type
|
||||||
|
template arguments require the user to explicitly specify the type of
|
||||||
|
the data member and this under-utilized feature is also not
|
||||||
|
well-implemented on all compilers, so passing the member pointer as a
|
||||||
|
runtime value is the only practical approach. The upshot is that any
|
||||||
|
such entity would actually have to be a function <i>object</i>, and I
|
||||||
|
haven't implemented automatic wrapping of C++ callable function
|
||||||
|
objects yet, so there is less re-use in the implementation than I'd
|
||||||
|
like. I hope to implement callable object wrapping and refactor this
|
||||||
|
code one day. I also hope to implement static data member support,
|
||||||
|
for which Python's property will not be an appropriate descriptor.
|
||||||
|
|
||||||
|
<h3><a name="miscellaneous">Miscellaneous</a></h3>
|
||||||
|
<ul>
|
||||||
|
<li>Moved <code>args<></code> and <code>bases<></code> from unnamed namespace to <code>boost::python</code> in their own header files.
|
||||||
|
<li>Convert <code>NULL</code> pointers returned from wrapped C++ functions to <code>None</code>.
|
||||||
|
<li>Improved some compile-time error checks.
|
||||||
|
<li>Eliminated <code>boost/python/detail/eval.hpp</code> in favor of
|
||||||
|
more-general <code>boost/mpl/apply.hpp</code>.
|
||||||
|
<li>General code cleanup and refactoring.
|
||||||
|
<li>Works with Microsoft Visual C++ 7.0
|
||||||
|
<li>Warning suppression for many compilers
|
||||||
|
<li>Elegant interface design for exporting <code>enum</code> types.
|
||||||
|
</ul>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="future">The Near Future</a></h2>
|
||||||
|
|
||||||
|
Before April 15th I plan to
|
||||||
|
<ol>
|
||||||
|
<li>Document all implemented features
|
||||||
|
<li>Implement a <code>CallPolicy</code> interface for constructors of wrapped
|
||||||
|
classes
|
||||||
|
<li>Implement conversions for <code>char</code> types.
|
||||||
|
<li>Implement automated code generation for all headers containing
|
||||||
|
families of overloaded functions to handle arbitrary arity.
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
I also hope to implement a mechanism for generating conversions
|
||||||
|
between arbitrary Python sequences and C++ containers, if time permits
|
||||||
|
(and others haven't already done it)!
|
||||||
|
|
||||||
|
<h2><a name="notes">Notes</a></h2>
|
||||||
|
|
||||||
|
The older version of KCC used by Kull is generating lots of warnings
|
||||||
|
about a construct I use to instantiate static members of various class
|
||||||
|
templates. I'm thinking of moving to an idiom which uses a function
|
||||||
|
template to suppress it, but worry about bloating the size of debug
|
||||||
|
builds. Since KCC users may be moving to GCC, I'm not sure that it's
|
||||||
|
worth doing anything about it.
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
1 April, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
</p>
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave Abrahams</a>
|
||||||
|
2002. All Rights Reserved.</i></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
309
doc/v2/May2002.html
Normal file
309
doc/v2/May2002.html
Normal file
@@ -0,0 +1,309 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
<title>Boost.Python - May 2002 Progress Report</title>
|
||||||
|
</head>
|
||||||
|
<body link="#0000ff" vlink="#800080">
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
<h2 align="center">May 2002 Progress Report</h2>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
<h2>Contents</h2>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="#intro">Introduction</a></dt>
|
||||||
|
<dt><a href="#features">New Features</a></dt>
|
||||||
|
<dl>
|
||||||
|
<dt><a href="#aix_shared">Shared Library Support for AIX</a><dd>
|
||||||
|
<dt><a href="#class_enhancements">Class Enhancements</a><dd>
|
||||||
|
<dl>
|
||||||
|
<dt><a href="#operators">Operators</a><dd>
|
||||||
|
<dt><a href="#iterators">Iterators</a><dd>
|
||||||
|
<dt><a href="#properties">Properties</a><dd>
|
||||||
|
<dt><a href="#setattr">setattr</a><dd>
|
||||||
|
<dt><a href="#module">__module__ Attribute</a><dd>
|
||||||
|
</dl>
|
||||||
|
<dt><a href="#back_reference">back_reference</a><dd>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#documentation">Documentation</a></dt>
|
||||||
|
<dt><a href="#misc">Miscellaneous</a></dt>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="#converters">Converters</a></dt>
|
||||||
|
<dt><a href="#checkins">Checkins Mailing List</a></dt>
|
||||||
|
<dt><a href="#shared">Shared Libraries</a></dt>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#next">What's Next</a></dt>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="intro">Introduction</a></h2>
|
||||||
|
|
||||||
|
Aside from library development, work on Boost.Python in May was
|
||||||
|
focused on reducing the support burden. In recent weeks, responding to
|
||||||
|
requests for support, espcially surrounding building the library, had
|
||||||
|
begun to impede progress on development. There was a major push to
|
||||||
|
release a stable 1.28.0 of Boost, including documentation of <a
|
||||||
|
href="../../../../tools/build/index.html">Boost.Build</a> and specific
|
||||||
|
<a href="../building.html">instructions</a> for building Boost.Python
|
||||||
|
v1. The documentation for Boost.Python v2 was also updated as
|
||||||
|
described <a href="#documentation">here</a>.
|
||||||
|
|
||||||
|
<h2><a name="features">New Features</a></h2>
|
||||||
|
|
||||||
|
<h3><a name="aix_shared">Shared Library Support for AIX</a></h3>
|
||||||
|
|
||||||
|
The Kull group required the ability to build and test Boost.Python
|
||||||
|
extensions on AIX, a platform with "creatively designed"
|
||||||
|
shared library semantics. Making this work was a multi-pronged
|
||||||
|
effort, involving changes to Boost.Build and some great research by
|
||||||
|
Martin Casado which uncovered the key mechanism required to allow
|
||||||
|
shared libraries to use functions from the Python executable. The
|
||||||
|
current solution used in Boost.Build relies on a <a
|
||||||
|
href="../../../../tools/build/gen_aix_import_file.py">Python
|
||||||
|
Script</a> as part of the build process. This is not a problem for
|
||||||
|
Boost.Python, as Python will be available. However, the commands
|
||||||
|
issued by the script are so simple that a 100%-pure-Boost.Jam
|
||||||
|
solution is surely possible. Linking on AIX is sufficiently
|
||||||
|
interesting to have skewed the Boost.Python development schedule a
|
||||||
|
bit.
|
||||||
|
|
||||||
|
<h3><a name="class_enhancements">Class Enhancements</a></h3>
|
||||||
|
|
||||||
|
<h4><a name="operators">Operators</a></h4>
|
||||||
|
|
||||||
|
Support for exposing C++ operators and functions as the corresponding
|
||||||
|
Python special methods was added. Thinking that the Boost.Python
|
||||||
|
<a href="../special.html#numeric">v1 interface</a> was a little too
|
||||||
|
esoteric (especially the use of
|
||||||
|
<code>left_operand<...>/right_operand<...></code> for
|
||||||
|
asymmetric operands), I introduced a simple form of <a
|
||||||
|
href="http://osl.iu.edu/~tveldhui/papers/Expression-Templates/exprtmpl.html">expression
|
||||||
|
templates</a> which allow users to simply write the expressions that
|
||||||
|
should be wrapped, as in this <a href="operators.html#examples">example</a>.
|
||||||
|
|
||||||
|
<h4><a name="iterators">Iterators</a></h4>
|
||||||
|
|
||||||
|
Python iterator support as required by the Kull project resulted in a
|
||||||
|
highly flexible interface allowing:
|
||||||
|
|
||||||
|
<dl>
|
||||||
|
|
||||||
|
<dt>Direct exposure of a class' <code>begin()</code> and
|
||||||
|
<code>end()</code> functions:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
...
|
||||||
|
.def("__iter__", iterator<list_int>())
|
||||||
|
</pre>
|
||||||
|
<dd>
|
||||||
|
|
||||||
|
<dt>Creation of iterators from member functions...
|
||||||
|
<pre>
|
||||||
|
...
|
||||||
|
.def("__iter__"
|
||||||
|
, range(&my_class::x_begin, &my_class::x_end))
|
||||||
|
)
|
||||||
|
</pre>
|
||||||
|
<dd>
|
||||||
|
|
||||||
|
<dt>...and member data:
|
||||||
|
<pre>
|
||||||
|
...
|
||||||
|
.def("__iter__"
|
||||||
|
, range(&std::pair<char*,char*>::first, &std::pair<char*,char*>::second))
|
||||||
|
)
|
||||||
|
</pre>
|
||||||
|
<dd>
|
||||||
|
|
||||||
|
<dt>The ability to specify <a
|
||||||
|
href="CallPolicies.html">CallPolicies</a>, e.g. to prevent copying of
|
||||||
|
heavyweight values:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
...
|
||||||
|
.def("__iter__",
|
||||||
|
, range<return_value_policy<copy_non_const_reference> >(
|
||||||
|
&my_sequence<heavy>::begin
|
||||||
|
, &my_sequence<heavy>::end))
|
||||||
|
</pre>
|
||||||
|
<dd>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h4><a name="properties">Properties</a></h4>
|
||||||
|
|
||||||
|
The Kull iteration interfaces also required the ability to iterate
|
||||||
|
over a sequence specified by an instance's attribute:
|
||||||
|
<pre>
|
||||||
|
>>> f = field()
|
||||||
|
>>> for e in f.elements:
|
||||||
|
... print e,
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
This forced the exposure of the <a
|
||||||
|
href="http://www.python.org/2.2/descrintro.html#property"><code>property</code></a>
|
||||||
|
interface used internally to implement the data member exposure
|
||||||
|
facility described in <a
|
||||||
|
href="Mar2002#data_members">March</a>. Properties are an
|
||||||
|
incredibly useful idiom, so it's good to be able to provide them
|
||||||
|
at little new development cost.
|
||||||
|
|
||||||
|
<h4><a name="setattr">setattr</a></h4>
|
||||||
|
|
||||||
|
<code>class_<></code> acquired a <code>setattr</code> member
|
||||||
|
function which allows users to easily add new Python objects as class
|
||||||
|
attributes.
|
||||||
|
|
||||||
|
<h4><a name="module">__module__ Attribute</a></h4>
|
||||||
|
|
||||||
|
Ralf Grosse-Kunstleve has been working on pickling support for v2. To
|
||||||
|
make it work correctly, he had to make sure that a class'
|
||||||
|
<code>__module__</code> attribute was set correctly.
|
||||||
|
|
||||||
|
<h3><a name="back_reference"><code>back_reference</code></a></h3>
|
||||||
|
|
||||||
|
The new <code>back_reference<T></code> template can be used as a
|
||||||
|
function parameter when the user needs access to both a <code>T</code>
|
||||||
|
argument and to the Python object which manages it. The function will
|
||||||
|
only match in the overload resolution process if it would match the
|
||||||
|
same function signature with <code>T</code> substituted for
|
||||||
|
<code>back_reference<T></code>. This feature is not yet
|
||||||
|
documented.
|
||||||
|
|
||||||
|
<h2><a name="documentation">Documentation</a></h2>
|
||||||
|
|
||||||
|
In a major effort to prepare Boost.Python v2 to replace v1, many pages
|
||||||
|
of new reference documentation were added:
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
|
||||||
|
<dl>
|
||||||
|
<dt><a href="CallPolicies.html">CallPolicies.html</a><dd>
|
||||||
|
<dt><a href="Dereferenceable.html">Dereferenceable.html</a><dd>
|
||||||
|
<dt><a href="Extractor.html">Extractor.html</a><dd>
|
||||||
|
<dt><a href="HolderGenerator.html">HolderGenerator.html</a><dd>
|
||||||
|
<dt><a href="ResultConverter.html">ResultConverter.html</a><dd>
|
||||||
|
<dt><a href="call_method.html">call_method.html</a><dd>
|
||||||
|
<dt><a href="callbacks.html">callbacks.html</a><dd>
|
||||||
|
<dt><a href="data_members.html">data_members.html</a><dd>
|
||||||
|
<dt><a href="has_back_reference.html">has_back_reference.html</a><dd>
|
||||||
|
<dt><a href="implicit.html">implicit.html</a><dd>
|
||||||
|
<dt><a href="instance_holder.html">instance_holder.html</a><dd>
|
||||||
|
<dt><a href="operators.html">operators.html</a><dd>
|
||||||
|
<dt><a href="ptr.html">ptr.html</a><dd>
|
||||||
|
<dt><a href="type_id.html">type_id.html</a><dd>
|
||||||
|
<dt><a href="with_custodian_and_ward.html">with_custodian_and_ward.html</a><dd>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
</blockquote>
|
||||||
|
Major updates were made to the following pages:
|
||||||
|
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<dl>
|
||||||
|
<dt><a href="call.html">call.html</a><dd> <dt><a href="updated">updated</a><dd>
|
||||||
|
<dt><a href="class.html">class.html</a><dd>
|
||||||
|
<dt><a href="reference.html">reference.html</a><dd>
|
||||||
|
</dl>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
As usual, careful documentation forces one to consider the
|
||||||
|
interface again, and there were many interface changes
|
||||||
|
associated with this effort, including the elevation of the
|
||||||
|
following components from implementation detail to
|
||||||
|
first-class library citizen:
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<dl>
|
||||||
|
<dt>type_id.hpp<dd>
|
||||||
|
<dt>pointee.hpp<dd>
|
||||||
|
<dt>lvalue_from_pytype.hpp<dd></dl>
|
||||||
|
</dl>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<h2><a name="misc">Miscellaneous</a></h2>
|
||||||
|
|
||||||
|
<h3><a name="converters">Converters</a></h3>
|
||||||
|
|
||||||
|
It appears that the world of C++ <==> Python conversion rules is
|
||||||
|
an endlessly-rich area of exploration. Completing the conversions for
|
||||||
|
<code>char</code> and <code>char const*</code> types, as described at
|
||||||
|
the end of <a href="Apr2002.html#missing">April's report</a>,
|
||||||
|
uncovered some interesting new shades to the problem. It turns out to
|
||||||
|
be worth distinguishing mutable and immutable lvalue conversions,
|
||||||
|
because despite the fact that Python doesn't understand
|
||||||
|
<code>const</code>, it does understand immutability (c.f. Python
|
||||||
|
strings, which expose an immutable <code>char</code> pointer). It is
|
||||||
|
also worth recognizing types which represent lvalue <i>sequences</i>,
|
||||||
|
to prevent Python <code>"foobar"</code> from being silently
|
||||||
|
truncated to C++ <code>'f'</code>. More details on this insight can be
|
||||||
|
found in the mailing list <a
|
||||||
|
href="http://mail.python.org/pipermail/c++-sig/2002-May/001023.html">
|
||||||
|
archive</a>. I don't plan to do anything about this immediately, but I
|
||||||
|
do think it's the right direction to go in the long run.
|
||||||
|
|
||||||
|
<h3><a name="checkins">Checkins Mailing List</a></h3>
|
||||||
|
|
||||||
|
In order to better coordinate changes made by multiple developers, I
|
||||||
|
enabled <a
|
||||||
|
href="http://sourceforge.net/docman/display_doc.php?docid=772&group_id=1">syncmail</a>
|
||||||
|
for the Boost.Python CVS trees, and established an associated <a
|
||||||
|
href="http://lists.sourceforge.net/lists/listinfo/boost-python-cvs">mailing
|
||||||
|
list</a>. Subscribe to this list to receive notices of each new
|
||||||
|
checkin.
|
||||||
|
|
||||||
|
<h3><a name="shared">Shared Libraries</a></h3>
|
||||||
|
|
||||||
|
Beyond the vagaries of dynamic linking on AIX, I have been
|
||||||
|
participating in a more-general discussion of dynamic linking for
|
||||||
|
C++. Needless to say, C++ dynamic linking is of critical importance to
|
||||||
|
Boost.Python: all extension modules are normally built as shared
|
||||||
|
libraries, and Boost.Python extension modules share a common library
|
||||||
|
as well.
|
||||||
|
|
||||||
|
In fact, there are at least two separate conversations. One
|
||||||
|
in the C++ standard extensions mailing list concerns what can be
|
||||||
|
standardized for C++ and shared libraries; the other, mostly on the <a
|
||||||
|
href="http://gcc.gnu.org/ml/gcc/">gcc</a> mailing list, concerns the
|
||||||
|
behavior of GCC on Posix/ELF platforms.
|
||||||
|
|
||||||
|
Some of the GCC threads are here:
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<a
|
||||||
|
href="http://gcc.gnu.org/ml/gcc/2002-05/msg02002.html">http://gcc.gnu.org/ml/gcc/2002-05/msg02002.html</a><br>
|
||||||
|
<a
|
||||||
|
href="http://gcc.gnu.org/ml/gcc/2002-05/msg02945.html">http://gcc.gnu.org/ml/gcc/2002-05/msg02945.html</a><br>
|
||||||
|
<a href="http://gcc.gnu.org/ml/gcc/2002-05/msg01758.html">http://gcc.gnu.org/ml/gcc/2002-05/msg01758.html</a>
|
||||||
|
</blockquote>
|
||||||
|
|
||||||
|
<h2><a name="next">What's Next</a></h2>
|
||||||
|
|
||||||
|
Development is focused on what's needed to be able to retire
|
||||||
|
Boost.Python v1. At the moment, that means deciding the user-friendly
|
||||||
|
interfaces for to_/from_python conversion, and formally exposing the
|
||||||
|
Python object smart pointers and object wrapper classes. Quite a few
|
||||||
|
questions have also been showing up recently about how to embed Python
|
||||||
|
with Boost.Python, and how to link with it statically; the solutions
|
||||||
|
to these issues will probably have to be formalized before long.
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
11 June, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
</p>
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave Abrahams</a>
|
||||||
|
2002. All Rights Reserved.</i></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
110
doc/v2/ResultConverter.html
Normal file
110
doc/v2/ResultConverter.html
Normal file
@@ -0,0 +1,110 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../../../boost.css">
|
||||||
|
<title>Boost.Python - ResultConverter Concept</title>
|
||||||
|
</head>
|
||||||
|
<body link="#0000ff" vlink="#800080">
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt="C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
<h2 align="center">ResultConverter Concept</h2>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a></dt>
|
||||||
|
<dt><a href="#concept-requirements">Concept Requirements</a></dt>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#ResultConverter-concept">ResultConverter Concept</a></dt>
|
||||||
|
<dt><a href="#ResultConverterGenerator-concept">ResultConverterGenerator Concept</a></dt>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<p>A ResultConverter for a type <code>T</code> is a type whose
|
||||||
|
instances can be used to convert C++ return values of type
|
||||||
|
<code>T</code> <code>to_python</code>. A ResultConverterGenerator is
|
||||||
|
an MPL unary metafunction class which, given the return type of a C++
|
||||||
|
function, returns a ResultConverter for that type. ResultConverters in
|
||||||
|
Boost.Python generally inspect library's registry of converters to
|
||||||
|
find a suitable converter, but converters which don't use the registry
|
||||||
|
are also possible.
|
||||||
|
|
||||||
|
<h2><a name="concept-requirements"></a>Concept Requirements</h2>
|
||||||
|
<h3><a name="ResultConverter-concept"></a>ResultConverter Concept</h3>
|
||||||
|
|
||||||
|
<p>In the table below, <code><b>C</b></code> denotes a ResultConverter
|
||||||
|
type for a type <b><code>R</code></b> , <code><b>c</b></code> denotes
|
||||||
|
an object of type <code><b>C</b></code> , and <code><b>r</b></code>
|
||||||
|
denotes an object of type <code><b>R</b></code>.
|
||||||
|
|
||||||
|
<table summary="ResultConverter expressions" border="1" cellpadding="5">
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><b>Expression</b></td>
|
||||||
|
<td><b>Type</b></td>
|
||||||
|
<td><b>Semantics</b></td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td valign="top"><code>C c;</code></td>
|
||||||
|
<td>
|
||||||
|
<td>Constructs a <code>C</code> object.
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td valign="top"><code>c.convertible()</code></td>
|
||||||
|
<td>convertible to <code>bool</code></td>
|
||||||
|
<td><code>false</code> iff no conversion from any <code>R</code> value
|
||||||
|
to a Python object is possible.</td>
|
||||||
|
</tr>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td valign="top"><code>c(r)</code></td>
|
||||||
|
<td>convertible to <code>PyObject*</code></td>
|
||||||
|
<td>A pointer to a Python object corresponding to <code>r</code>,
|
||||||
|
or <code>0</code> iff <code>r</code> could not be converted
|
||||||
|
<code>to_python</code>, in which case <a
|
||||||
|
href="http://www.python.org/doc/current/api/exceptionHandling.html#l2h-71">PyErr_Occurred</a>
|
||||||
|
should return non-zero.</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h3><a name="ResultConverterGenerator-concept"></a>ResultConverterGenerator Concept</h3>
|
||||||
|
<p>In the table below, <code><b>G</b></code> denotes a
|
||||||
|
ResultConverterGenerator type and <code><b>R</b></code> denotes a possible
|
||||||
|
C++ function return type.
|
||||||
|
|
||||||
|
<table summary="ResultConverterGenerator expressions" border="1" cellpadding="5">
|
||||||
|
<tr>
|
||||||
|
<td><b>Expression</b></td>
|
||||||
|
<td><b>Requirements</b></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td valign="top"><code>G::apply<R>::type</code></td>
|
||||||
|
<td>A ResultConverter type for <code>R</code>.</td>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
09 May, 2002 <!--Luann's birthday! -->
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
</p>
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
|
<p>Permission to copy, use, modify, sell
|
||||||
|
and distribute this software is granted provided this copyright notice appears
|
||||||
|
in all copies. This software is provided "as is" without express or implied
|
||||||
|
warranty, and with no claim as to its suitability for any purpose.
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
32
doc/v2/acknowledgments.html
Normal file
32
doc/v2/acknowledgments.html
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
<title>Boost.Python - Acknowledgments</title>
|
||||||
|
</head>
|
||||||
|
<body link="#0000ff" vlink="#800080">
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
<h2 align="center">Acknowledgments</h2>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
{{text}}
|
||||||
|
<hr>
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
05 November, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
</p>
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave Abrahams</a>
|
||||||
|
2002. All Rights Reserved.</i></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
32
doc/v2/bibliography.html
Normal file
32
doc/v2/bibliography.html
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
<title>Boost.Python - Bibliography</title>
|
||||||
|
</head>
|
||||||
|
<body link="#0000ff" vlink="#800080">
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
<h2 align="center">Bibliography</h2>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
{{bibliographical information}}
|
||||||
|
<hr>
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
05 November, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
</p>
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave Abrahams</a>
|
||||||
|
2002. All Rights Reserved.</i></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
82
doc/v2/call.html
Normal file
82
doc/v2/call.html
Normal file
@@ -0,0 +1,82 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
<title>Boost.Python - <call.hpp></title>
|
||||||
|
</head>
|
||||||
|
<body link="#0000ff" vlink="#800080">
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
<h2 align="center">Header <call.hpp></h2>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
<h2>Contents</h2>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a></dt>
|
||||||
|
<dt><a href="#functions">Functions</a></dt>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#call-spec">call</a></dt>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example(s)</a></dt>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
<p>
|
||||||
|
<code><boost/python/call.hpp></code> defines the <a
|
||||||
|
href="#call-spec"><code>call</code></a> family of overloaded function
|
||||||
|
templates, used to invoke Python callable objects from C++.
|
||||||
|
|
||||||
|
<h2><a name="functions"></a>Functions</h2>
|
||||||
|
<pre>
|
||||||
|
<a name="call-spec">template <class R, class A1, class A2, ... class A<i>n</i>></a>
|
||||||
|
R call(PyObject* callable, A1 const&, A2 const&, ... A<i>n</i> const&)
|
||||||
|
</pre>
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>R</code> is a pointer type, reference
|
||||||
|
type, or a complete type with an accessible copy constructor</dt>
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> Invokes <code>callable(a1, a2, ...a<i>n</i>)</code> in
|
||||||
|
Python, where <code>a1</code>...<code>a<i>n</i></code> are the arguments to
|
||||||
|
<code>call()</code>, converted to Python objects.
|
||||||
|
<dt><b>Returns:</b> The result of the Python call, converted to the C++ type <code>R</code>.</dt>
|
||||||
|
|
||||||
|
</dt>
|
||||||
|
<dt><b>Rationale:</b> For a complete semantic description and
|
||||||
|
rationale, see <a href="callbacks.html">this page</a>.
|
||||||
|
</dt>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example(s)</h2>
|
||||||
|
|
||||||
|
The following C++ function applies a Python callable object to its two
|
||||||
|
arguments and returns the result. If a Python exception is raised or
|
||||||
|
the result can't be converted to a <code>double</code>, an exception
|
||||||
|
is thrown.
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
double apply2(PyObject* func, double x, double y)
|
||||||
|
{
|
||||||
|
return boost::python::call<double>(func, x, y);
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
9 May, 2002 <!-- Luann's birthday! -->
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
</p>
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave Abrahams</a>
|
||||||
|
2002. All Rights Reserved.</i></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
141
doc/v2/call_method.html
Normal file
141
doc/v2/call_method.html
Normal file
@@ -0,0 +1,141 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
<title>Boost.Python - <call_method.hpp></title>
|
||||||
|
</head>
|
||||||
|
<body link="#0000ff" vlink="#800080">
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
<h2 align="center">Header <call_method.hpp></h2>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
<h2>Contents</h2>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a></dt>
|
||||||
|
<dt><a href="#functions">Functions</a></dt>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#call_method-spec">call_method</a></dt>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example(s)</a></dt>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
<p>
|
||||||
|
<code><boost/python/call_method.hpp></code> defines the <a
|
||||||
|
href="#call_method-spec"><code>call_method</code></a> family of overloaded function
|
||||||
|
templates, used to invoke callable attributes of Python objects from C++.
|
||||||
|
|
||||||
|
<h2><a name="functions"></a>Functions</h2>
|
||||||
|
<pre>
|
||||||
|
<a name="call_method-spec">template <class R, class A1, class A2, ... class A<i>n</i>></a>
|
||||||
|
R call_method(PyObject* self, char const* method, A1 const&, A2 const&, ... A<i>n</i> const&)
|
||||||
|
</pre>
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>R</code> is a pointer type, reference
|
||||||
|
type, or a complete type with an accessible copy constructor</dt>
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> Invokes <code>self.<i>method</i>(a1, a2, ...a<i>n</i>)</code> in
|
||||||
|
Python, where <code>a1</code>...<code>a<i>n</i></code> are the arguments to
|
||||||
|
<code>call_method()</code>, converted to Python objects. For a
|
||||||
|
complete semantic description, see <a href="callbacks.html">this
|
||||||
|
page</a>.
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> The result of the Python call, converted to the
|
||||||
|
C++ type <code>R</code>.</dt>
|
||||||
|
|
||||||
|
</dt>
|
||||||
|
<dt><b>Rationale:</b> <code>call_method</code> is critical to
|
||||||
|
implementing C++ virtual functions which are overridable in Python,
|
||||||
|
as shown by the example below.
|
||||||
|
</dt>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example(s)</h2>
|
||||||
|
|
||||||
|
The following C++ illustrates the use of <code>call_method</code> in
|
||||||
|
wrapping a class with a virtual function that can be overridden in
|
||||||
|
Python:
|
||||||
|
|
||||||
|
<h3>C++ Module Definition</h3>
|
||||||
|
<pre>
|
||||||
|
#include <boost/python/module.hpp>
|
||||||
|
#include <boost/python/class.hpp>
|
||||||
|
#include <boost/utility.hpp>
|
||||||
|
#include <cstring>
|
||||||
|
|
||||||
|
// class to be wrapped
|
||||||
|
class Base
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
virtual char const* class_name() const { return "Base"; }
|
||||||
|
virtual ~Base();
|
||||||
|
};
|
||||||
|
|
||||||
|
bool is_base(Base* b)
|
||||||
|
{
|
||||||
|
return !std::strcmp(b->class_name(), "Base");
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wrapper code begins here
|
||||||
|
using namespace boost::python;
|
||||||
|
|
||||||
|
// Callback class
|
||||||
|
class Base_callback : public Base
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Base_callback(PyObject* self) : m_self(self) {}
|
||||||
|
|
||||||
|
char const* class_name() const { return <b>call_method</b>(m_self, "class_name"); }
|
||||||
|
char const* Base_name() const { return Base::class_name(); }
|
||||||
|
private:
|
||||||
|
PyObject* m_self;
|
||||||
|
};
|
||||||
|
|
||||||
|
using namespace boost::python;
|
||||||
|
BOOST_PYTHON_MODULE_INIT(my_module)
|
||||||
|
{
|
||||||
|
module("my_module")
|
||||||
|
.def("is_base", is_base)
|
||||||
|
.add(
|
||||||
|
class_<Base,Base_callback, noncopyable>("Base")
|
||||||
|
.def("class_name", Base_callback::Base_name);
|
||||||
|
)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h3>Python Code</h3>
|
||||||
|
<pre>
|
||||||
|
>>> from my_module import *
|
||||||
|
>>> class Derived(Base):
|
||||||
|
... def __init__(self):
|
||||||
|
... Base.__init__(self)
|
||||||
|
... def class_name(self):
|
||||||
|
... return self.__class__.__name__
|
||||||
|
...
|
||||||
|
>>> is_base(Base()) # calls the class_name() method from C++
|
||||||
|
1
|
||||||
|
>>> is_base(Derived())
|
||||||
|
0
|
||||||
|
</pre>
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
10 May, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
</p>
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave Abrahams</a>
|
||||||
|
2002. All Rights Reserved.</i></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
246
doc/v2/callbacks.html
Normal file
246
doc/v2/callbacks.html
Normal file
@@ -0,0 +1,246 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
<title>Boost.Python - Calling Python Functions and Methods</title>
|
||||||
|
</head>
|
||||||
|
<body link="#0000ff" vlink="#800080">
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
<h2 align="center">Calling Python Functions and Methods</h2>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
<h2>Contents</h2>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a></dt>
|
||||||
|
<dt><a href="#argument_handling">Argument Handling</a></dt>
|
||||||
|
<dt><a href="#result_handling">Result Handling</a></dt>
|
||||||
|
<dt><a href="#result_handling">Rationale</a></dt>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="introduction">Introduction</a></h2>
|
||||||
|
<p>
|
||||||
|
Boost.Python provides two families of function templates,
|
||||||
|
<code><a href="call.html#call-spec">call</a></code> and <code><a
|
||||||
|
href="call_method.html#call_method-spec">call_method</a></code>, for
|
||||||
|
invoking Python functions and methods respectively. The interface for
|
||||||
|
calling a Python function object (or any Python callable object) looks
|
||||||
|
like:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
call<ResultType>(callable_object, a1, a2... a<i>N</i>);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
Calling a method of a Python object is similarly easy:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
call_method<ResultType>(self_object, "<i>method-name</i>", a1, a2... a<i>N</i>);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
|
||||||
|
<h2><a name="argument_handling">Argument Handling</a></h2>
|
||||||
|
<p>
|
||||||
|
|
||||||
|
Arguments are converted to Python according to their type. By default,
|
||||||
|
the arguments <code>a1</code>...<code>a<i>N</i></code> are copied into
|
||||||
|
new Python objects, but this behavior can be overridden by the use of
|
||||||
|
<code><a href="ptr.html#ptr-spec">ptr()</a></code> and <a
|
||||||
|
href="../../../bind/ref.html#reference_wrapper">ref()</a>:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
class X : boost::noncopyable
|
||||||
|
{
|
||||||
|
...
|
||||||
|
};
|
||||||
|
|
||||||
|
void apply(PyObject* callable, X& x)
|
||||||
|
{
|
||||||
|
// Invoke callable, passing a Python object which holds a reference to x
|
||||||
|
boost::python::call<void>(callable, boost::ref(x));
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
In the table below, <code><b>x</b></code> denotes the actual argument
|
||||||
|
object and <code><b>cv</b></code> denotes an optional
|
||||||
|
<i>cv-qualification</i>: "<code>const</code>",
|
||||||
|
"<code>volatile</code>", or "<code>const
|
||||||
|
volatile</code>".
|
||||||
|
|
||||||
|
<table border="1" summary="class_ template parameters">
|
||||||
|
<tr>
|
||||||
|
<th>Argument Type
|
||||||
|
|
||||||
|
<th>Behavior
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>T cv&</code><br>
|
||||||
|
<code>T cv</code>
|
||||||
|
|
||||||
|
<td>The Python argument is created by the same means used
|
||||||
|
for the return value of a wrapped C++ function returning
|
||||||
|
<code>T</code>. When
|
||||||
|
<code>T</code> is a class type, that normally means
|
||||||
|
<code>*x</code> is copy-constructed into the new Python
|
||||||
|
object.
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>T*</code>
|
||||||
|
|
||||||
|
<td>If <code>x == 0</code>, the Python argument will
|
||||||
|
be <code><a
|
||||||
|
href="http://www.python.org/doc/current/lib/bltin-null-object.html">None</a></code>. Otherwise,
|
||||||
|
the Python argument is created by the same means used for the
|
||||||
|
return value of a wrapped C++ function returning
|
||||||
|
<code>T</code>. When
|
||||||
|
<code>T</code> is a class type, that normally means
|
||||||
|
<code>*x</code> is copy-constructed into the new Python
|
||||||
|
object.
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code><a
|
||||||
|
href="../../../bind/ref.html#reference_wrapper">boost::reference_wrapper</a><T> </code>
|
||||||
|
|
||||||
|
<td>The Python argument contains a pointer to, rather than a
|
||||||
|
copy of, <code>x.get()</code>. Note: failure to ensure that no
|
||||||
|
Python code holds a reference to the resulting object beyond
|
||||||
|
the lifetime of <code>*x.get()</code> <b>may result in a
|
||||||
|
crash!</b>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code><a
|
||||||
|
href="ptr.html#pointer_wrapper-spec">pointer_wrapper</a><T></code>
|
||||||
|
|
||||||
|
<td>If <code>x.get() == 0</code>, the Python
|
||||||
|
argument will be <code><a
|
||||||
|
href="http://www.python.org/doc/current/lib/bltin-null-object.html">None</a></code>.
|
||||||
|
Otherwise, the Python argument contains a pointer to, rather
|
||||||
|
than a copy of, <code>*x.get()</code>. Note: failure to ensure
|
||||||
|
that no Python code holds a reference to the resulting object
|
||||||
|
beyond the lifetime of <code>*x.get()</code> <b>may result in
|
||||||
|
a crash!</b>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h2><a name="result_handling">Result Handling</a></h2>
|
||||||
|
|
||||||
|
In general, <code>call<ResultType>()</code> and
|
||||||
|
<code>call_method<ResultType>()</code> return
|
||||||
|
<code>ResultType</code> by exploiting all lvalue and rvalue
|
||||||
|
<code>from_python</code> converters registered for ResultType and
|
||||||
|
returning a copy of the result. However, when
|
||||||
|
<code>ResultType</code> is a pointer or reference type, Boost.Python
|
||||||
|
searches only for lvalue converters. To prevent dangling pointers and
|
||||||
|
references, an exception will be thrown if the Python result object
|
||||||
|
has only a single reference count.
|
||||||
|
|
||||||
|
<h2><a name="rationale">Rationale</a></h2>
|
||||||
|
|
||||||
|
In general, to get Python arguments corresponding to
|
||||||
|
<code>a1</code>...<code>a<i>N</i></code>, a new Python object must be
|
||||||
|
created for each one; should the C++ object be copied into that Python
|
||||||
|
object, or should the Python object simply hold a reference/pointer to
|
||||||
|
the C++ object? In general, the latter approach is unsafe, since the
|
||||||
|
called function may store a reference to the Python object
|
||||||
|
somewhere. If the Python object is used after the C++ object is
|
||||||
|
destroyed, we'll crash Python.
|
||||||
|
|
||||||
|
<p>In keeping with the philosophy that users on the Python side
|
||||||
|
shouldn't have to worry about crashing the interpreter, the default
|
||||||
|
behavior is to copy the C++ object, and to allow a non-copying
|
||||||
|
behavior only if the user writes <code><a
|
||||||
|
href="../../../bind/ref.html">boost::ref</a>(a1)</code> instead of a1
|
||||||
|
directly. At least this way, the user doesn't get dangerous behavior
|
||||||
|
"by accident". It's also worth noting that the non-copying
|
||||||
|
("by-reference") behavior is in general only available for
|
||||||
|
class types, and will fail at runtime with a Python exception if used
|
||||||
|
otherwise[<a href="#1">1</a>].
|
||||||
|
|
||||||
|
<p>
|
||||||
|
However, pointer types present a problem: one approach is to refuse
|
||||||
|
to compile if any aN has pointer type: after all, a user can always pass
|
||||||
|
<code>*aN</code> to pass "by-value" or <code>ref(*aN)</code>
|
||||||
|
to indicate a pass-by-reference behavior. However, this creates a
|
||||||
|
problem for the expected null pointer to
|
||||||
|
<code>None</code> conversion: it's illegal to dereference a null
|
||||||
|
pointer value.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
The compromise I've settled on is this:
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li>The default behavior is pass-by-value. If you pass a non-null
|
||||||
|
pointer, the pointee is copied into a new Python object; otherwise
|
||||||
|
the corresponding Python argument will be None.
|
||||||
|
|
||||||
|
<li>if you want by-reference behavior, use <code>ptr(aN)</code> if
|
||||||
|
<code>aN</code> is a pointer and <code>ref(aN)</code> otherwise. If
|
||||||
|
a null pointer is passed to <code>ptr(aN)</code>, the corresponding
|
||||||
|
Python argument will be <code>None</code>.
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
As for results, we have a similar problem: if <code>ResultType</code>
|
||||||
|
is allowed to be a pointer or reference type, the lifetime of the
|
||||||
|
object it refers to is probably being managed by a Python object. When
|
||||||
|
that Python object is destroyed, our pointer dangles. The problem is
|
||||||
|
particularly bad when the <code>ResultType</code> is char const* - the
|
||||||
|
corresponding Python String object is typically uniquely-referenced,
|
||||||
|
meaning that the pointer dangles as soon as <code>call<char
|
||||||
|
const*>(...)</code> returns.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The old Boost.Python v1 deals with this issue by refusing to compile
|
||||||
|
any uses of <code>call<char const*>()</code>, but this goes both
|
||||||
|
too far and not far enough. It goes too far because there are cases
|
||||||
|
where the owning Python string object survives beyond the call (just
|
||||||
|
for instance, when it's the name of a Python class), and it goes not
|
||||||
|
far enough because we might just as well have the same problem with a
|
||||||
|
returned pointer or reference of any other type.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
In Boost.Python v2 this is dealt with by:
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li> lifting the compile-time restriction on const
|
||||||
|
char* callback returns
|
||||||
|
|
||||||
|
|
||||||
|
<li> detecting the case when the reference count on the result
|
||||||
|
Python object is 1 and throwing an exception inside of
|
||||||
|
<code>call<U>(...)</code> when <code>U</code> is a pointer
|
||||||
|
or reference type.
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
This should be acceptably safe because users have to explicitly
|
||||||
|
specify a pointer/reference for <code>U</code> in
|
||||||
|
<code>call<U></code>, and they will be protected against dangles
|
||||||
|
at runtime, at least long enough to get out of the
|
||||||
|
<code>call<U>(...)</code> invocation.
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<a name="1">[1]</a> It would be possible to make it fail at compile-time for non-class
|
||||||
|
types such as int and char, but I'm not sure it's a good idea to impose
|
||||||
|
this restriction yet.
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
17 April, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
</p>
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave Abrahams</a>
|
||||||
|
2002. All Rights Reserved.</i></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
88
doc/v2/callbacks.txt
Normal file
88
doc/v2/callbacks.txt
Normal file
@@ -0,0 +1,88 @@
|
|||||||
|
Here's the plan:
|
||||||
|
|
||||||
|
I aim to provide an interface similar to that of Boost.Python v1's
|
||||||
|
callback<>::call(...) for dealing with callbacks. The interface will
|
||||||
|
look like:
|
||||||
|
|
||||||
|
returning<ResultType>::call("method_name", self_object, a1, a2...);
|
||||||
|
|
||||||
|
or
|
||||||
|
|
||||||
|
returning<ResultType>::call(callable_object, a1, a2...);
|
||||||
|
|
||||||
|
ARGUMENT HANDLING
|
||||||
|
|
||||||
|
There is an issue concerning how to make Python objects from the
|
||||||
|
arguments a1...aN. A new Python object must be created; should the C++
|
||||||
|
object be copied into that Python object, or should the Python object
|
||||||
|
simply hold a reference/pointer to the C++ object? In general, the
|
||||||
|
latter approach is unsafe, since the called function may store a
|
||||||
|
reference to the Python object somewhere. If the Python object is used
|
||||||
|
after the C++ object is destroyed, we'll crash Python.
|
||||||
|
|
||||||
|
I plan to make the copying behavior the default, and to allow a
|
||||||
|
non-copying behavior if the user writes boost::ref(a1) instead of a1
|
||||||
|
directly. At least this way, the user doesn't get dangerous behavior "by
|
||||||
|
accident". It's also worth noting that the non-copying ("by-reference")
|
||||||
|
behavior is in general only available for class types, and will fail at
|
||||||
|
runtime with a Python exception if used otherwise**
|
||||||
|
|
||||||
|
However, pointer types present a problem: My first thought is to refuse
|
||||||
|
to compile if any aN has pointer type: after all, a user can always pass
|
||||||
|
*aN to pass "by-value" or ref(*aN) to indicate a pass-by-reference
|
||||||
|
behavior. However, this creates a problem for the expected NULL pointer
|
||||||
|
=> None conversion: it's illegal to dereference a null pointer value.
|
||||||
|
|
||||||
|
We could use another construct, say "ptr(aN)", to deal with null
|
||||||
|
pointers, but then what does it mean? We know what it does when aN is
|
||||||
|
NULL, but it might either have by-value or by-reference behavior when aN
|
||||||
|
is non-null.
|
||||||
|
|
||||||
|
The compromise I've settled on is this:
|
||||||
|
|
||||||
|
1. The default behavior is pass-by-value. If you pass a non-null
|
||||||
|
pointer, the pointee is copied into a new Python object; otherwise
|
||||||
|
the corresponding Python argument will be None.
|
||||||
|
|
||||||
|
2. if you want by-reference behavior, use ptr(aN) if aN is a pointer
|
||||||
|
and ref(aN) otherwise. If a null pointer is passed to ptr(aN), the
|
||||||
|
corresponding Python argument will be None.
|
||||||
|
|
||||||
|
RESULT HANDLING
|
||||||
|
|
||||||
|
As for results, we have a similar problem: if ResultType is allowed to
|
||||||
|
be a pointer or reference type, the lifetime of the object it refers to
|
||||||
|
is probably being managed by a Python object. When that Python object is
|
||||||
|
destroyed, our pointer dangles. The problem is particularly bad when the
|
||||||
|
ResultType is char const* - the corresponding Python String object is
|
||||||
|
typically uniquely-referenced, meaning that the pointer dangles as soon
|
||||||
|
as returning<char const*>::call() returns.
|
||||||
|
|
||||||
|
Boost.Python v1 deals with this issue by refusing to compile any uses of
|
||||||
|
callback<char const*>::call(), but IMO this goes both too far and not
|
||||||
|
far enough. It goes too far because there are cases where the owning
|
||||||
|
String object survives beyond the call (just for instance when it's the
|
||||||
|
name of a Python class), and it goes not far enough because we might
|
||||||
|
just as well have the same problem with any returned pointer or
|
||||||
|
reference.
|
||||||
|
|
||||||
|
I propose to address this in Boost.Python v2 by
|
||||||
|
|
||||||
|
1. lifting the compile-time restriction on const
|
||||||
|
char* callback returns
|
||||||
|
|
||||||
|
2. detecting the case when the reference count on the
|
||||||
|
result Python object is 1 and throwing an exception
|
||||||
|
inside of returning<U>::call() when U is a pointer or
|
||||||
|
reference type.
|
||||||
|
|
||||||
|
I think this is acceptably safe because users have to explicitly specify
|
||||||
|
a pointer/reference for U in returning<U>, and they will be protected
|
||||||
|
against dangles at runtime, at least long enough to get out of the
|
||||||
|
returning<U>::call() invocation.
|
||||||
|
|
||||||
|
-Dave
|
||||||
|
|
||||||
|
**It would be possible to make it fail at compile-time for non-class
|
||||||
|
types such as int and char, but I'm not sure it's a good idea to impose
|
||||||
|
this restriction yet.
|
||||||
589
doc/v2/class.html
Normal file
589
doc/v2/class.html
Normal file
@@ -0,0 +1,589 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - <boost/python/class.hpp>,
|
||||||
|
<boost/python/class_fwd.hpp></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Headers <boost/python/class.hpp>,
|
||||||
|
<boost/python/class_fwd.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a>
|
||||||
|
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#class_-spec">Class template <code>class_</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#class_-spec-synopsis">Class <code>class_</code>
|
||||||
|
synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#class_-spec-ctors">Class <code>class_</code>
|
||||||
|
constructors</a>
|
||||||
|
|
||||||
|
<dt><a href="#class_-spec-modifiers">Class <code>class_</code>
|
||||||
|
modifier functions</a>
|
||||||
|
|
||||||
|
<dt><a href="#class_-spec-observers">Class <code>class_</code>
|
||||||
|
observer functions</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#bases-spec">Class template <code>bases</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#bases-spec-synopsis">Class <code>bases</code>
|
||||||
|
synopsis</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#args-spec">Class template <code>args</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#args-spec-synopsis">Class <code>args</code>
|
||||||
|
synopsis</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example(s)</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<p><code><boost/python/class.hpp></code> defines the interface
|
||||||
|
through which users expose their C++ classes to Python. It declares the
|
||||||
|
<code>class_</code> class template, which is parameterized on the
|
||||||
|
class type being exposed. It also exposes the <code>args</code>
|
||||||
|
and <code>bases</code> utility class templates, which are used in
|
||||||
|
conjunction with <code>class_</code>.
|
||||||
|
|
||||||
|
<p><code><boost/python/class_fwd.hpp></code> contains a forward
|
||||||
|
declaration of the <code>class_</code> class template.
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="class_-spec"></a>Class template <code>class_<T, <font color="#007f00">Bases, HeldType, NonCopyable</font>></code></h3>
|
||||||
|
|
||||||
|
<p>Creates a Python class associated with the C++ type passed as
|
||||||
|
its first parameter. Although it has four template parameters,
|
||||||
|
only the first one is required. The three optional arguments can
|
||||||
|
actually be supplied <font color="#007f00"><b>in any
|
||||||
|
order</b></font>; Boost.Python determines the role of the argument
|
||||||
|
from its type.<br>
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<table border="1" summary="class_ template parameters">
|
||||||
|
<tr>
|
||||||
|
<th>Template Parameter
|
||||||
|
|
||||||
|
<th>Requirements
|
||||||
|
|
||||||
|
<th>Semantics
|
||||||
|
|
||||||
|
<th>Default
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>T</code>
|
||||||
|
|
||||||
|
<td>A class type.
|
||||||
|
|
||||||
|
<td>The class being wrapped
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code><font color="#007f00">Bases</font></code>
|
||||||
|
|
||||||
|
<td>A specialization of <a
|
||||||
|
href="#bases-spec"><code>bases<...></code></a> which
|
||||||
|
specifies previously-exposed C++ base classes of <code>T</code><a href="#footnote_1">[1]</a>.
|
||||||
|
|
||||||
|
<td>Registers <code>from_python</code> conversions from
|
||||||
|
wrapped <code>T</code> instances to each of its exposed direct
|
||||||
|
and indirect bases. For each polymorphic base <code>B</code>,
|
||||||
|
registers conversions from indirectly-held wrapped
|
||||||
|
<code>B</code> instances to <code>T</code>.
|
||||||
|
|
||||||
|
<td><code><a href="#bases">bases<></a></code>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code><font color="#007f00">HeldType</font></code>
|
||||||
|
|
||||||
|
<td>Must be <code>T</code>, a class derived
|
||||||
|
from <code>T</code>, or a <a
|
||||||
|
href="Dereferenceable.html">Dereferenceable</a> type for which
|
||||||
|
<code><a
|
||||||
|
href="pointee.html#pointee-spec">pointee</a><HeldType>::type</code>
|
||||||
|
is <code>T</code> or a class derived from <code>T</code>.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<td>Specifies the type which is actually embedded in a Python
|
||||||
|
object wrapping a <code>T</code> instance. More details <a
|
||||||
|
href="#HeldType">below</a>.
|
||||||
|
|
||||||
|
<td><code>T</code>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code><font color="#007f00">NonCopyable</font></code>
|
||||||
|
|
||||||
|
<td>If supplied, must be <a
|
||||||
|
href="../../../utility/utility.htm#Class noncopyable">boost::noncopyable</a>.
|
||||||
|
|
||||||
|
<td> Suppresses automatic registration of <code>to_python</code>
|
||||||
|
conversions which copy
|
||||||
|
<code>T</code> instances. Required when <code>T</code> has no
|
||||||
|
publicly-accessible copy constructor.
|
||||||
|
|
||||||
|
<td>An unspecified type other than <code>boost::noncopyable</code>.
|
||||||
|
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h4><a name="#HeldType">HeldType Semantics</a></h4>
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li>
|
||||||
|
If <code>HeldType</code> is derived from T, its
|
||||||
|
exposed constructor(s) must accept an initial
|
||||||
|
<code>PyObject*</code> argument which refers back to the Python
|
||||||
|
object that contains it, as shown in <a
|
||||||
|
href="call_method.html#example">this example</a>. This argument is
|
||||||
|
not included in the argument list type passed to <a
|
||||||
|
href="#def_init-spec"><code>def_init()</code></a>, below, nor is
|
||||||
|
it passed explicitly by users when Python instances of
|
||||||
|
<code>T</code> are created. This is the idiom which allows C++ virtual
|
||||||
|
functions to be overridden in Python. Boost.Python automatically
|
||||||
|
registers additional converters which allow wrapped instances of
|
||||||
|
<code>T</code> to be passed to wrapped C++ functions expecting
|
||||||
|
<code>HeldType</code> arguments.
|
||||||
|
|
||||||
|
<li>Because Boost.Python will always allow
|
||||||
|
wrapped instances of <code>T</code> to be passed in place of
|
||||||
|
<code>HeldType</code> arguments, specifying a smart pointer for
|
||||||
|
<code>HeldType</code> allows users to pass Python
|
||||||
|
<code>T</code> instances where a smart pointer-to-<code>T</code> is
|
||||||
|
expected. Smart pointers such as <code>std::auto_ptr<></code>
|
||||||
|
or <code><a
|
||||||
|
href="../../../smart_ptr/shared_ptr.htm">boost::shared_ptr<></a></code>
|
||||||
|
which contain a nested type <code>element_type</code> designating
|
||||||
|
the referent type are automatically supported; additional smart
|
||||||
|
pointer types can be supported by specializing <a
|
||||||
|
href="pointee.html#pointee-spec">pointee<HeldType></a>.
|
||||||
|
|
||||||
|
<li>
|
||||||
|
As in case 1 above, when <code>HeldType</code> is a smart pointer to
|
||||||
|
a class derived from <code>T</code>, the initial
|
||||||
|
<code>PyObject*</code> argument must be supplied by all exposed
|
||||||
|
constructors.
|
||||||
|
|
||||||
|
<li>
|
||||||
|
Except in cases 1 and 3, users may optionally specify that T itself
|
||||||
|
gets initialized with a similar initial <code>PyObject*</code>
|
||||||
|
argument by specializing <a
|
||||||
|
href="has_back_reference.html#has_back_reference-spec">has_back_reference<T></a>.
|
||||||
|
</ol>
|
||||||
|
|
||||||
|
<h4><a name="class_-spec-synopsis"></a>Class template
|
||||||
|
<code>class_</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
template <class T
|
||||||
|
<font color="#007f00"> , class Bases = bases<>
|
||||||
|
, class HeldType = T
|
||||||
|
, class NonCopyable = <i>unspecified</i>
|
||||||
|
>
|
||||||
|
</font> class class_
|
||||||
|
{
|
||||||
|
class_();
|
||||||
|
class_(char const* name);
|
||||||
|
|
||||||
|
// exposing constructors
|
||||||
|
class_& def_init();
|
||||||
|
|
||||||
|
template <class Args>
|
||||||
|
class_& def_init(Args const& = Args());
|
||||||
|
|
||||||
|
template <class Args, class CallPolicy>
|
||||||
|
class_& def_init(Args const&, CallPolicy policy);
|
||||||
|
|
||||||
|
// exposing member functions
|
||||||
|
template <class F>
|
||||||
|
class_& def(char const* name, F f);
|
||||||
|
|
||||||
|
template <class Fn, class CallPolies>
|
||||||
|
class_& def(char const* name, Fn fn, CallPolies);
|
||||||
|
|
||||||
|
// exposing operators
|
||||||
|
template <<i>unspecified</i>>
|
||||||
|
class_& def(<a href="operators.html#operator_-spec">detail::operator_</a><unspecified>);
|
||||||
|
|
||||||
|
// exposing data members
|
||||||
|
template <class D>
|
||||||
|
class_& def_readonly(char const* name, D T::*pm);
|
||||||
|
|
||||||
|
template <class D>
|
||||||
|
class_& def_readwrite(char const* name, D T::*pm);
|
||||||
|
|
||||||
|
// Raw attribute modification
|
||||||
|
class_& setattr(char const* name, ref const&);
|
||||||
|
|
||||||
|
// property creation
|
||||||
|
void add_property(char const* name, ref const& fget);
|
||||||
|
void add_property(char const* name, ref const& fget, ref const& fset);
|
||||||
|
|
||||||
|
// accessing the Python class object
|
||||||
|
ref object() const;
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="class_-spec-ctors"></a>Class template <code>class_</code> constructors</h4>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
class_();
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> The platform's <code>std::type_info::name()</code>
|
||||||
|
implementation produces a string which corresponds to the type's
|
||||||
|
declaration in C++
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> Constructs a <code>class_</code> object which
|
||||||
|
generates a Boost.Python extension class with the same name as
|
||||||
|
<code>T</code>.
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> Many platforms can generate reasonable names for
|
||||||
|
Python classes without user intervention.
|
||||||
|
</dl>
|
||||||
|
<pre>
|
||||||
|
class_(char const* name);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>name</code> is a ntbs which conforms to
|
||||||
|
Python's <a href=
|
||||||
|
"http://www.python.org/doc/2.2/ref/identifiers.html">identifier
|
||||||
|
naming rules</a>.
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> Constructs a <code>class_</code> object which
|
||||||
|
generates a Boost.Python extension class named <code>name</code>.
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> Gives the user full control over class naming.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h4><a name="class_-spec-modifiers"></a>Class template <code>class_</code>
|
||||||
|
modifier functions</h4>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
class_& def_init();
|
||||||
|
|
||||||
|
template <class Args>
|
||||||
|
class_& def_init(Args const& argument_types);
|
||||||
|
|
||||||
|
template <class Args, class CallPolicies>
|
||||||
|
class_& def_init(Args const& argument_types, CallPolicies policies);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>Args</code> is an <a
|
||||||
|
href="../../../mpl/doc/Sequences.html">MPL sequence</a> of C++ argument
|
||||||
|
types (<i>A1, A2,... AN</i>) such that if
|
||||||
|
<code>a1, a2</code>... <code>aN</code> are objects of type
|
||||||
|
<i>A1, A2,... AN</i> respectively, the expression
|
||||||
|
<code>T(a1, a2</code>... <code>aN</code>) is valid. In the first form,
|
||||||
|
the expression <code>T()</code> must be valid.
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> Adds the result of
|
||||||
|
|
||||||
|
<code><a href=
|
||||||
|
"make_function.html#make_constructor-spec">make_constructor</a><args<>,Holder>()</code>,
|
||||||
|
|
||||||
|
<code><a href=
|
||||||
|
"make_function.html#make_constructor-spec">make_constructor</a><Args,Holder>()</code>, or
|
||||||
|
|
||||||
|
<code><a href=
|
||||||
|
"make_function.html#make_constructor-spec">make_constructor</a><Args,Holder>(policies)</code>,
|
||||||
|
respectively, to the Boost.Python extension class being defined under the name
|
||||||
|
"__init__". <code>Holder</code> is a concrete subclass of <a
|
||||||
|
href="instance_holder.html#instance_holder-spec">instance_holder</a>
|
||||||
|
which holds the <code>HeldType</code>. If the extension class
|
||||||
|
already has an "__init__" attribute, the usual <a
|
||||||
|
href="http:overloading.html">overloading procedure</a> applies.
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> <code>*this</code>
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> Allows users to easily expose a class' constructor
|
||||||
|
to Python.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
template <class F>
|
||||||
|
class_& def(char const* name, F f);
|
||||||
|
|
||||||
|
template <class Fn, class CallPolicies>
|
||||||
|
class_& def(char const* name, Fn f, CallPolicies policies);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>f</code> is a non-null
|
||||||
|
pointer-to-function or pointer-to-member-function, or a callable
|
||||||
|
Python object passed as a <code>PyObject*</code> or <a
|
||||||
|
href="reference_hpp.html#ref-spec"><code>ref</code></a>. <code>name</code>
|
||||||
|
is a ntbs which conforms to Python's <a href=
|
||||||
|
"http://www.python.org/doc/2.2/ref/identifiers.html">identifier
|
||||||
|
naming rules</a>. In the first form, the return type of
|
||||||
|
<code>f</code> is not a reference and is not a pointer other
|
||||||
|
than <code>char const*</code> or <code>PyObject*</code>. In the
|
||||||
|
second form <code>policies</code> is a model of <a
|
||||||
|
href="CallPolicies.html">CallPolicies</a>.
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> Adds the result of <code><a href=
|
||||||
|
"make_function.html#make_function-spec">make_function</a>(f)</code> or <code><a href=
|
||||||
|
"make_function.html#make_function-spec">make_function</a>(f, policies)</code> to
|
||||||
|
the Boost.Python extension class being defined, with the given
|
||||||
|
<code>name</code>. If the extension class already has an attribute named
|
||||||
|
<code><i>name</i></code>, the usual <a href=
|
||||||
|
"overloading.html">overloading procedure</a> applies.
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> <code>*this</code>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
template <<i>unspecified</i>>
|
||||||
|
class_& def(<a href="operators.html#operator_-spec">detail::operator_</a><unspecified>);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Effects:</b> Adds a Python <a
|
||||||
|
href="http://www.python.org/doc/ref/specialnames.html">special
|
||||||
|
method</a> as described <a href="operators.html">here</a>.
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> <code>*this</code>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
template <class F>
|
||||||
|
class_& setattr(char const* name, ref x);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>name</code> is a ntbs which conforms to
|
||||||
|
Python's <a href=
|
||||||
|
"http://www.python.org/doc/2.2/ref/identifiers.html">identifier
|
||||||
|
naming rules</a>.
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> <code><a href="http://www.python.org/doc/current/api/object.html#l2h-166">PyObject_SetAttrString</a>(this->object(), name, x.get());</code>
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> <code>*this</code>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
void add_property(char const* name, ref const& fget);
|
||||||
|
void add_property(char const* name, ref const& fget, ref const& fset);
|
||||||
|
</pre>
|
||||||
|
<dl class="function-semantics">
|
||||||
|
|
||||||
|
<dt><b>Requires:</b> <code>name</code> is a ntbs which conforms to
|
||||||
|
Python's <a href=
|
||||||
|
"http://www.python.org/doc/2.2/ref/identifiers.html">identifier
|
||||||
|
naming rules</a>.
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> Creates a new Python <a
|
||||||
|
href="http://www.python.org/2.2/descrintro.html#property"><code>property</code></a>
|
||||||
|
class instance, passing <code>fget.get()</code> (and
|
||||||
|
<code>fset.get()</code> in the second form) to its constructor,
|
||||||
|
then adds that property to the Python class object under
|
||||||
|
construction with the given attribute <code>name</code>.
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> <code>*this</code>
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> Allows users to easily expose a class'
|
||||||
|
data member such that it can be inspected from Python with a
|
||||||
|
natural syntax.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
<pre>
|
||||||
|
template <class D>
|
||||||
|
class_& def_readonly(char const* name, D T::*pm);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
|
||||||
|
<dt><b>Requires:</b> <code>name</code> is a ntbs which conforms to
|
||||||
|
Python's <a href=
|
||||||
|
"http://www.python.org/doc/2.2/ref/identifiers.html">identifier
|
||||||
|
naming rules</a>.
|
||||||
|
|
||||||
|
<dt><b>Effects:</b>
|
||||||
|
<pre>
|
||||||
|
this->add_property(name, ref(<a href="data_members.html#make_getter-spec">make_getter</a>(pm)));
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> <code>*this</code>
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> Allows users to easily expose a class'
|
||||||
|
data member such that it can be inspected from Python with a
|
||||||
|
natural syntax.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<br>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
template <class D>
|
||||||
|
class_& def_readwrite(char const* name, D T::*pm);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
|
||||||
|
<dt><b>Effects:</b>
|
||||||
|
<pre>
|
||||||
|
ref fget(<a href="data_members.html#make_getter-spec">make_getter</a>(pm));
|
||||||
|
ref fset(<a href="data_members.html#make_setter-spec">make_setter</a>(pm));
|
||||||
|
this->add_property(name, fget, fset);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> <code>*this</code>
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> Allows users to easily expose a class'
|
||||||
|
data member such that it can be inspected and set from Python with a
|
||||||
|
natural syntax.
|
||||||
|
|
||||||
|
<h4><a name="class_-spec-observers"></a>Class template <code>class_</code>
|
||||||
|
observer functions</h4>
|
||||||
|
<pre>
|
||||||
|
ref object() const;
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Returns:</b> A <code>ref</code> object which holds a reference to
|
||||||
|
the Boost.Python extension class object created by the
|
||||||
|
<code>class_</code> constructor.
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> Mostly not needed by users, since <code><a href=
|
||||||
|
"module.html#add-spec">module::add</a>()</code> uses this to insert the
|
||||||
|
extension class in the module.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h3><a name="args-spec"></a>Class template
|
||||||
|
<code>args<T1, T2,</code>...<code>TN></code></h3>
|
||||||
|
|
||||||
|
<p>A conveniently-named <a
|
||||||
|
href="../../../mpl/doc/Sequences.html">MPL sequence</a> which
|
||||||
|
users pass to <code><a
|
||||||
|
href="#class_-spec-modifiers">def_init</a></code> calls to make
|
||||||
|
their code more readable.
|
||||||
|
|
||||||
|
<h4><a name="args-spec-synopsis"></a>Class template <code>args</code>
|
||||||
|
synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
template <T1 = <i>unspecified</i>,...TN = <i>unspecified</i>>
|
||||||
|
struct args
|
||||||
|
{};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h3><a name="bases-spec"></a>Class template
|
||||||
|
<code>bases<T1, T2,</code>...<code>TN></code></h3>
|
||||||
|
|
||||||
|
<p>An <a
|
||||||
|
href="../../../mpl/doc/Sequences.html">MPL sequence</a> which
|
||||||
|
can be used in <code>class_<</code>...<code>></code>
|
||||||
|
instantiations indicate a list of base classes. Although users
|
||||||
|
can pass any MPL sequence in place of args, above, the use of
|
||||||
|
<code>bases</code> to indicate base classes is mandatory.
|
||||||
|
|
||||||
|
<h4><a name="bases-spec-synopsis"></a>Class template <code>bases</code>
|
||||||
|
synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
template <T1 = <i>unspecified</i>,...TN = <i>unspecified</i>>
|
||||||
|
struct bases
|
||||||
|
{};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example(s)</h2>
|
||||||
|
|
||||||
|
<p>Given a C++ class declaration:
|
||||||
|
<pre>
|
||||||
|
class Foo : public Bar, public Baz
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Foo(int, char const*);
|
||||||
|
Foo(double);
|
||||||
|
|
||||||
|
std::string const& name() { return m_name; }
|
||||||
|
void name(char const*);
|
||||||
|
|
||||||
|
double value; // public data
|
||||||
|
private:
|
||||||
|
...
|
||||||
|
};
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
A corresponding Boost.Python extension class can be created with:
|
||||||
|
<pre>
|
||||||
|
using namespace boost::python;
|
||||||
|
|
||||||
|
ref foo = class_<Foo,bases<Bar,Baz> >()
|
||||||
|
.def_init(args<int,char const*>())
|
||||||
|
.def_init(args<double>())
|
||||||
|
.def("get_name", &Foo::get_name, return_internal_reference<>())
|
||||||
|
.def("set_name", &Foo::set_name)
|
||||||
|
.def_readwrite("value", &Foo::value)
|
||||||
|
.object();
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<a name="footnote_1">[1]</a> By "previously-exposed" we mean that the for each
|
||||||
|
<code>B</code> in <code>bases</code>, an instance of
|
||||||
|
<code>class_<B></code> must have already been
|
||||||
|
constructed. Ensuring this in a portable manner when a class and its
|
||||||
|
bases are exposed in the same module entails using separate
|
||||||
|
<i>full-expressions</i>, rather than chaining consecutive definitions with
|
||||||
|
"<code>.add(...)</code>.
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
module m("module_name");
|
||||||
|
m.add(class_<Base>()
|
||||||
|
.def_init());
|
||||||
|
m.add(class_<Derived, bases<Base>>()
|
||||||
|
.def_init());
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
09 May, 2002 <!-- Luann's birthday! -->
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
91
doc/v2/configuration.html
Normal file
91
doc/v2/configuration.html
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
<title>Boost.Python - Configuration</title>
|
||||||
|
</head>
|
||||||
|
<body link="#0000ff" vlink="#800080">
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
<h2 align="center">Configuration</h2>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a></dt>
|
||||||
|
<dt><a href="#app-defined">Application Defined Macros</a></dt>
|
||||||
|
<dt><a href="#lib-defined-public">Public Library Defined Macros</a></dt>
|
||||||
|
<dt><a href="#lib-defined-impl">Library Defined Implementation Macros</a></dt>
|
||||||
|
</dl>
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
<p>Boost.Python uses several configuration macros in <a href="http://www.boost.org/libs/config/config.htm"><boost/config.hpp></a>,
|
||||||
|
as well as configuration macros meant to be supplied by the application. These
|
||||||
|
macros are documented here.</p>
|
||||||
|
<h2><a name="app-defined"></a>Application Defined Macros</h2>
|
||||||
|
<p>These are the macros that may be defined by an application using Boost.Python.</p>
|
||||||
|
<table summary="application defined macros" cellspacing="10" width="100%">
|
||||||
|
<tr>
|
||||||
|
<td><b>Macro</b></td>
|
||||||
|
<td><b>Meaning</b></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{macro}}</td>
|
||||||
|
<td>{{meaning}}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{macro}}</td>
|
||||||
|
<td>{{meaning}}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<h2><a name="lib-defined-public"></a>Public Library Defined Macros</h2>
|
||||||
|
<p>These macros are defined by Boost.Python but are expected to be used by application
|
||||||
|
code.</p>
|
||||||
|
<table summary="public library defined macros" cellspacing="10" width="100%">
|
||||||
|
<tr>
|
||||||
|
<td><b>Macro</b></td>
|
||||||
|
<td><b>Meaning</b></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{macro}}</td>
|
||||||
|
<td>{{meaning}}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{macro}}</td>
|
||||||
|
<td>{{meaning}}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<h2><a name="lib-defined-impl"></a>Library Defined Implementation Macros</h2>
|
||||||
|
<p>These macros are defined by Boost.Python and are implementation details of interest
|
||||||
|
only to implementers.</p>
|
||||||
|
<table summary="library defined implementation macros" cellspacing="10" width="100%">
|
||||||
|
<tr>
|
||||||
|
<td><b>Macro</b></td>
|
||||||
|
<td><b>Meaning</b></td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{macro}}</td>
|
||||||
|
<td>{{meaning}}</td>
|
||||||
|
</tr>
|
||||||
|
<tr>
|
||||||
|
<td>{{macro}}</td>
|
||||||
|
<td>{{meaning}}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
05 November, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
</p>
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave Abrahams</a>
|
||||||
|
2002. All Rights Reserved.</i></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
135
doc/v2/copy_const_reference.html
Normal file
135
doc/v2/copy_const_reference.html
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - <boost/python/copy_const_reference.hpp></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Header
|
||||||
|
<boost/python/copy_const_reference.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#copy_const_reference-spec">Class
|
||||||
|
<code>copy_const_reference</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#copy_const_reference-spec-synopsis">Class
|
||||||
|
<code>copy_const_reference</code> synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#copy_const_reference-spec-metafunctions">Class
|
||||||
|
<code>copy_const_reference</code> metafunctions</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="copy_const_reference-spec"></a>Class
|
||||||
|
<code>copy_const_reference</code></h3>
|
||||||
|
|
||||||
|
<p><code>copy_const_reference</code> is a model of <a href=
|
||||||
|
"ResultConverter.html#ResultConverterGenerator-concept">ResultConverterGenerator</a> which can be
|
||||||
|
used to wrap C++ functions returning a reference-to-const type such that
|
||||||
|
the referenced value is copied into a new Python object.
|
||||||
|
|
||||||
|
<h4><a name="copy_const_reference-spec-synopsis"></a>Class
|
||||||
|
<code>copy_const_reference</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
struct copy_const_reference
|
||||||
|
{
|
||||||
|
template <class T> struct apply;
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="copy_const_reference-spec-metafunctions"></a>Class
|
||||||
|
<code>copy_const_reference</code> metafunctions</h4>
|
||||||
|
<pre>
|
||||||
|
template <class T> struct apply
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="metafunction-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>T</code> is <code>U const&</code> for some
|
||||||
|
<code>U</code>.
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> <code>typedef <a href=
|
||||||
|
"to_python_value.html#to_python_value-spec">to_python_value</a><T>
|
||||||
|
type;</code>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example</h2>
|
||||||
|
|
||||||
|
<h3>C++ Module Definition</h3>
|
||||||
|
<pre>
|
||||||
|
#include <boost/python/module.hpp>
|
||||||
|
#include <boost/python/class.hpp>
|
||||||
|
#include <boost/python/copy_const_reference.hpp>
|
||||||
|
#include <boost/python/return_value_policy.hpp>
|
||||||
|
|
||||||
|
// classes to wrap
|
||||||
|
struct Bar { int x; }
|
||||||
|
|
||||||
|
struct Foo {
|
||||||
|
Foo(int x) : { b.x = x; }
|
||||||
|
Bar const& get_bar() const { return b; }
|
||||||
|
private:
|
||||||
|
Bar b;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Wrapper code
|
||||||
|
using namespace boost::python;
|
||||||
|
BOOST_PYTHON_MODULE_INIT(my_module)
|
||||||
|
{
|
||||||
|
module m("my_module")
|
||||||
|
.add(
|
||||||
|
class_<Bar>()
|
||||||
|
)
|
||||||
|
.add(
|
||||||
|
class_<Foo>()
|
||||||
|
.def_init(args<int>())
|
||||||
|
.def("get_bar", &Foo::get_bar
|
||||||
|
, return_value_policy<copy_const_reference>())
|
||||||
|
)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
<h3>Python Code</h3>
|
||||||
|
<pre>
|
||||||
|
>>> from my_module import *
|
||||||
|
>>> f = Foo(3) # create a Foo object
|
||||||
|
>>> b = f.get_bar() # make a copy of the internal Bar object
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
15 February, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
135
doc/v2/copy_non_const_reference.html
Normal file
135
doc/v2/copy_non_const_reference.html
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python -
|
||||||
|
<boost/python/copy_non_const_reference.hpp></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Header
|
||||||
|
<boost/python/copy_non_const_reference.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#copy_non_const_reference-spec">Class
|
||||||
|
<code>copy_non_const_reference</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#copy_non_const_reference-spec-synopsis">Class
|
||||||
|
<code>copy_non_const_reference</code> synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#copy_non_const_reference-spec-metafunctions">Class
|
||||||
|
<code>copy_non_const_reference</code> metafunctions</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="copy_non_const_reference-spec"></a>Class
|
||||||
|
<code>copy_non_const_reference</code></h3>
|
||||||
|
|
||||||
|
<p><code>copy_non_const_reference</code> is a model of <a href=
|
||||||
|
"ResultConverter.html#ResultConverterGenerator-concept">ResultConverterGenerator</a> which can be
|
||||||
|
used to wrap C++ functions returning a reference-to-non-const type such
|
||||||
|
that the referenced value is copied into a new Python object.
|
||||||
|
|
||||||
|
<h4><a name="copy_non_const_reference-spec-synopsis"></a>Class
|
||||||
|
<code>copy_non_const_reference</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
struct copy_non_const_reference
|
||||||
|
{
|
||||||
|
template <class T> struct apply;
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="copy_non_const_reference-spec-metafunctions"></a>Class
|
||||||
|
<code>copy_non_const_reference</code> metafunctions</h4>
|
||||||
|
<pre>
|
||||||
|
template <class T> struct apply
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="metafunction-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>T</code> is <code>U&</code> for some
|
||||||
|
non-const <code>U</code>.
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> <code>typedef <a href=
|
||||||
|
"to_python_value.html#to_python_value-spec">to_python_value</a><T>
|
||||||
|
type;</code>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example</h2>
|
||||||
|
|
||||||
|
<p>C++ code:
|
||||||
|
<pre>
|
||||||
|
#include <boost/python/module.hpp>
|
||||||
|
#include <boost/python/class.hpp>
|
||||||
|
#include <boost/python/copy_non_const_reference.hpp>
|
||||||
|
#include <boost/python/return_value_policy.hpp>
|
||||||
|
|
||||||
|
// classes to wrap
|
||||||
|
struct Bar { int x; }
|
||||||
|
|
||||||
|
struct Foo {
|
||||||
|
Foo(int x) : { b.x = x; }
|
||||||
|
Bar& get_bar() { return b; }
|
||||||
|
private:
|
||||||
|
Bar b;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Wrapper code
|
||||||
|
using namespace boost::python;
|
||||||
|
BOOST_PYTHON_MODULE_INIT(my_module)
|
||||||
|
{
|
||||||
|
module("my_module")
|
||||||
|
.add(
|
||||||
|
class_<Bar>()
|
||||||
|
)
|
||||||
|
.add(
|
||||||
|
class_<Foo>()
|
||||||
|
.def_init(args<int>())
|
||||||
|
.def("get_bar", &Foo::get_bar
|
||||||
|
, return_value_policy<copy_non_const_reference>())
|
||||||
|
);
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
Python Code:
|
||||||
|
<pre>
|
||||||
|
>>> from my_module import *
|
||||||
|
>>> f = Foo(3) # create a Foo object
|
||||||
|
>>> b = f.get_bar() # make a copy of the internal Bar object
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
05 November, 2001
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
150
doc/v2/data_members.html
Normal file
150
doc/v2/data_members.html
Normal file
@@ -0,0 +1,150 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - <boost/python/data_members.hpp></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Header <boost/python/data_members.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a>
|
||||||
|
|
||||||
|
<dt><a href="#functions">Functions</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#make_getter-spec">make_getter</a>
|
||||||
|
|
||||||
|
<dt><a href="#make_setter-spec">make_setter</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<p><code><a href="#make_getter-spec">make_getter</a>()</code> and
|
||||||
|
<code><a href="#make_setter-spec">make_setter</a>()</code> are
|
||||||
|
the functions used internally by <code>class_<>::<a href=
|
||||||
|
"class.html#class_-spec-modifiers">def_readonly</a></code> and
|
||||||
|
<code>class_<>::<a href=
|
||||||
|
"class.html#class_-spec-modifiers">def_readwrite</a></code> to
|
||||||
|
produce Python callable objects which wrap C++ data members.
|
||||||
|
|
||||||
|
<h2><a name="functions"></a>Functions</h2>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
<a name="make_getter-spec">template <class C, class D></a>
|
||||||
|
objects::function* make_getter(D C::*pm);
|
||||||
|
|
||||||
|
template <class C, class D, class Policies>
|
||||||
|
objects::function* make_getter(D C::*pm, Policies const& policies);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>Policies</code> is a model of <a
|
||||||
|
href="CallPolicies.html">CallPolicies</a>.
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> Creates a Python callable object which
|
||||||
|
accepts a single argument that can be converted
|
||||||
|
<code>from_python</code> to <code>C*</code>, and returns the
|
||||||
|
corresponding member <code>D</code> member of the <code>C</code>
|
||||||
|
object, converted <code>to_python</code>. If
|
||||||
|
<code>policies</code> is supplied, it will be applied to the
|
||||||
|
function as described <a href=
|
||||||
|
"CallPolicies.html">here</a>.
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> A pointer convertible to <code>PyObject*</code> which
|
||||||
|
refers to the new Python callable object.
|
||||||
|
</dl>
|
||||||
|
<pre>
|
||||||
|
<a name="make_setter-spec">template <class C, class D></a>
|
||||||
|
objects::function* make_setter(D C::*pm);
|
||||||
|
|
||||||
|
template <class C, class D, class Policies>
|
||||||
|
objects::function* make_setter(D C::*pm, Policies const& policies);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function*-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>Policies</code> is a model of <a
|
||||||
|
href="CallPolicies.html">CallPolicies</a>.
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> Creates a Python callable object which, when
|
||||||
|
called from Python, expects two arguments which can be converted
|
||||||
|
<code>from_python</code> to <code>C*</code> and
|
||||||
|
<code>D const&</code>, respectively, and sets the
|
||||||
|
corresponding <code>D</code> member of the <code>C</code>
|
||||||
|
object. If <code>policies</code> is supplied, it will be applied
|
||||||
|
to the function as described <a
|
||||||
|
href="CallPolicies.html">here</a>.
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> A pointer convertible to
|
||||||
|
<code>PyObject*</code> which refers to the new Python callable
|
||||||
|
object.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example</h2>
|
||||||
|
|
||||||
|
<p>The code below uses make_getter and make_setter to expose a
|
||||||
|
data member as functions:
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
#include <boost/python/data_members.hpp>
|
||||||
|
#include <boost/python/module.hpp>
|
||||||
|
#include <boost/python/class.hpp>
|
||||||
|
|
||||||
|
struct X
|
||||||
|
{
|
||||||
|
X(int x) : y(x) {}
|
||||||
|
int y;
|
||||||
|
};
|
||||||
|
|
||||||
|
using namespace boost::python;
|
||||||
|
|
||||||
|
BOOST_PYTHON_MODULE_INIT(data_members_example)
|
||||||
|
{
|
||||||
|
module("data_members_example")
|
||||||
|
.add(
|
||||||
|
class_<X>("X")
|
||||||
|
.def_init(args<int>())
|
||||||
|
.def("get", make_getter(&X::y))
|
||||||
|
.def("set", make_setter(&X::y))
|
||||||
|
)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
It can be used this way in Python:
|
||||||
|
<pre>
|
||||||
|
>>> from data_members_example import *
|
||||||
|
>>> x = X(1)
|
||||||
|
>>> x.get()
|
||||||
|
1
|
||||||
|
>>> x.set(2)
|
||||||
|
>>> x.get()
|
||||||
|
2
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
8 May 2002 <!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
170
doc/v2/default_call_policies.html
Normal file
170
doc/v2/default_call_policies.html
Normal file
@@ -0,0 +1,170 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python -
|
||||||
|
<boost/python/default_call_policies.hpp></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Header
|
||||||
|
<boost/python/default_call_policies.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#default_call_policies-spec">Class
|
||||||
|
<code>default_call_policies</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#default_call_policies-spec-synopsis">Class
|
||||||
|
<code>default_call_policies</code> synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#default_call_policies-spec-statics">Class
|
||||||
|
<code>default_call_policies</code> static functions</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#default_result_converter-spec">Class
|
||||||
|
<code>default_result_converter</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#default_result_converter-spec-synopsis">Class
|
||||||
|
<code>default_result_converter</code> synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#default_result_converter-spec-metafunctions">Class
|
||||||
|
<code>default_result_converter</code> metafunctions</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="default_call_policies-spec"></a>Class
|
||||||
|
<code>default_call_policies</code></h3>
|
||||||
|
|
||||||
|
<p><code>default_call_policies</code> is a model of <a href=
|
||||||
|
"CallPolicies.html">CallPolicies</a> with no <code>precall</code> or
|
||||||
|
<code>postcall</code> behavior and a <code>result_converter</code> which
|
||||||
|
handles by-value returns. Wrapped C++ functions and member functions use
|
||||||
|
<code>default_call_policies</code> unless otherwise specified. You may find
|
||||||
|
it convenient to derive new models of <a href=
|
||||||
|
"CallPolicies.html">CallPolicies</a> from
|
||||||
|
<code>default_call_policies</code>.
|
||||||
|
|
||||||
|
<h4><a name="default_call_policies-spec-synopsis"></a>Class
|
||||||
|
<code>default_call_policies</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
struct default_call_policies
|
||||||
|
{
|
||||||
|
static bool precall(PyObject*);
|
||||||
|
static PyObject* postcall(PyObject*, PyObject* result);
|
||||||
|
typedef <a href=
|
||||||
|
"#default_result_converter-spec">default_result_converter</a> result_converter;
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="default_call_policies-spec-statics"></a>Class
|
||||||
|
<code>default_call_policies</code> static functions</h4>
|
||||||
|
<pre>
|
||||||
|
bool precall(PyObject*);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Returns:</b> <code>true</code>
|
||||||
|
|
||||||
|
<dt><b>Throws:</b> nothing
|
||||||
|
</dl>
|
||||||
|
<pre>
|
||||||
|
PyObject* postcall(PyObject*, PyObject* result);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Returns:</b> <code>result</code>
|
||||||
|
|
||||||
|
<dt><b>Throws:</b> nothing
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h3><a name="default_result_converter-spec"></a>Class
|
||||||
|
<code>default_result_converter</code></h3>
|
||||||
|
|
||||||
|
<p><code>default_result_converter</code> is a model of <a href=
|
||||||
|
"ResultConverter.html#ResultConverterGenerator-concept">ResultConverterGenerator</a> which can be
|
||||||
|
used to wrap C++ functions returning non-pointer types, <code>char
|
||||||
|
const*</code>, and <code>PyObject*</code>, by-value.
|
||||||
|
|
||||||
|
<h4><a name="default_result_converter-spec-synopsis"></a>Class
|
||||||
|
<code>default_result_converter</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
struct default_result_converter
|
||||||
|
{
|
||||||
|
template <class T> struct apply;
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="default_result_converter-spec-metafunctions"></a>Class
|
||||||
|
<code>default_result_converter</code> metafunctions</h4>
|
||||||
|
<pre>
|
||||||
|
template <class T> struct apply
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="metafunction-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>T</code> is not a reference type. If
|
||||||
|
<code>T</code> is a pointer type, <code>T</code> is <code>const
|
||||||
|
char*</code> or <code>PyObject*</code>.
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> <code>typedef <a href=
|
||||||
|
"to_python_value.html#to_python_value-spec">to_python_value</a><T
|
||||||
|
const&> type;</code>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example</h2>
|
||||||
|
|
||||||
|
<p>This example comes from the Boost.Python implementation itself. Because
|
||||||
|
the <a href=
|
||||||
|
"return_value_policy.html#return_value_policy-spec">return_value_policy</a>
|
||||||
|
class template does not implement <code>precall</code> or
|
||||||
|
<code>postcall</code> behavior, its default base class is
|
||||||
|
<code>default_call_policies</code>:
|
||||||
|
<pre>
|
||||||
|
template <class Handler, class Base = default_call_policies>
|
||||||
|
struct return_value_policy : Base
|
||||||
|
{
|
||||||
|
typedef Handler result_converter;
|
||||||
|
};
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
05 November, 2001
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
35
doc/v2/definitions.html
Normal file
35
doc/v2/definitions.html
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
<title>Boost.Python - Definitions</title>
|
||||||
|
</head>
|
||||||
|
<body link="#0000ff" vlink="#800080">
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
<h2 align="center">Definitions</h2>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
<dl class="definitions">
|
||||||
|
<dt><b>{{term}}:</b> {{definition}}</dt>
|
||||||
|
<dt><b>{{term}}:</b> {{definition}}</dt>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
05 November, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
</p>
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave Abrahams</a>
|
||||||
|
2002. All Rights Reserved.</i></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
241
doc/v2/errors.html
Normal file
241
doc/v2/errors.html
Normal file
@@ -0,0 +1,241 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - <boost/python/errors.hpp></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Header <boost/python/errors.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a>
|
||||||
|
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#error_already_set-spec">Class <code>error_already_set</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#error_already_set-spec-synopsis">Class
|
||||||
|
<code>error_already_set</code> synopsis</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#functions">Functions</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#handle_exception-spec">handle_exception</a>
|
||||||
|
|
||||||
|
<dt><a href="#expect_non_null-spec">expect_non_null</a>
|
||||||
|
<dt><a href="#throw_error_already_set-spec">throw_error_already_set</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Examples</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<p><code><boost/python/errors.hpp></code> provides types and
|
||||||
|
functions for managing and translating between Python and C++ exceptions.
|
||||||
|
This is relatively low-level functionality that is mostly used internally
|
||||||
|
by Boost.Python. Users should seldom need it.
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="error_already_set-spec"></a>Class
|
||||||
|
<code>error_already_set</code></h3>
|
||||||
|
|
||||||
|
<p><code>error_already_set</code> is an exception type which can be thrown
|
||||||
|
to indicate that a Python error has occurred. If thrown, the precondition
|
||||||
|
is that <a href=
|
||||||
|
"http://www.python.org/doc/2.2/api/exceptionHandling.html#l2h-71">PyErr_Occurred()</a>
|
||||||
|
returns a value convertible to <code>true</code>.
|
||||||
|
|
||||||
|
<h4><a name="error_already_set-spec-synopsis"></a>Class error_already_set synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
class error_already_set {};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h2><a name="functions"></a>Functions</h2>
|
||||||
|
<pre>
|
||||||
|
<a name=
|
||||||
|
"handle_exception-spec">template <class T> bool handle_exception</a>(T f) throw();
|
||||||
|
|
||||||
|
void handle_exception() throw();
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="handle_exception-semantics">
|
||||||
|
<dt><b>Requires:</b> The first form requires that the expression <code><a
|
||||||
|
href=
|
||||||
|
"../../../function/doc/reference.html#functionN">function0</a><void>(f)</code>
|
||||||
|
is valid. The second form requires that a C++ exception is currently
|
||||||
|
being handled (see section 15.1 in the C++ standard).
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> The first form calls <code>f()</code> inside a
|
||||||
|
<code>try</code> block whose <code>catch</code> clauses set an
|
||||||
|
appropriate Python exception for the C++ exception caught, returning
|
||||||
|
<code>true</code> if an exception was caught, <code>false</code>
|
||||||
|
otherwise. The second form passes a function which rethrows the exception
|
||||||
|
currently being handled to the first form.
|
||||||
|
|
||||||
|
<dt><b>Postconditions:</b> No exception is being handled
|
||||||
|
|
||||||
|
<dt><b>Throws:</b> nothing
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> At inter-language boundaries it is important to
|
||||||
|
ensure that no C++ exceptions escape, since the calling language usually
|
||||||
|
doesn't have the equipment neccessary to properly unwind the stack. Use
|
||||||
|
<code>handle_exception</code> to manage exception translation whenever
|
||||||
|
your C++ code is called directly from the Python API. This is done for
|
||||||
|
you automatically by the usual function wrapping facilities: <a href=
|
||||||
|
"make_function.html#make_function-spec">make_function()</a>, <a href=
|
||||||
|
"make_function.html#make_constructor-spec">make_constructor()</a>, <a
|
||||||
|
href="module.html#def-spec">module::def</a> and <a href=
|
||||||
|
"class.html#def-spec">class_::def</a>). The second form can be more
|
||||||
|
convenient to use (see the <a href="#examples">example</a> below), but
|
||||||
|
various compilers have problems when exceptions are rethrown from within
|
||||||
|
an enclosing <code>try</code> block.
|
||||||
|
</dl>
|
||||||
|
<pre>
|
||||||
|
<a name="expect_non_null-spec">template <class T> T* expect_non_null(T* x);</a>
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="expect_non_null-semantics">
|
||||||
|
<dt><b>Returns:</b> <code>x</code>
|
||||||
|
|
||||||
|
<dt><b>Throws:</b> <code><a href=
|
||||||
|
"#error_already_set-spec">error_already_set()</a></code> iff <code>x ==
|
||||||
|
0</code>.
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> Simplifies error-handling when calling many
|
||||||
|
functions in the <a href=
|
||||||
|
"http://www.python.org/doc/2.2/api/api.html">Python/C API</a>, which
|
||||||
|
return 0 on error.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
<a name="throw_error_already_set-spec">void throw_error_already_set();</a>
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="throw_error_already_set-semantics">
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> <code>throw <a href=
|
||||||
|
"#error_already_set-spec">error_already_set</a>();</code>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Examples</h2>
|
||||||
|
<pre>
|
||||||
|
#include <string>
|
||||||
|
#include <boost/python/errors.hpp>
|
||||||
|
#include <boost/python/reference.hpp>
|
||||||
|
|
||||||
|
// Returns a std::string which has the same value as obj's "__name__"
|
||||||
|
// attribute.
|
||||||
|
std::string get_name(boost::python::ref obj)
|
||||||
|
{
|
||||||
|
// throws if there's no __name__ attribute
|
||||||
|
PyObject* p = boost::python::expect_non_null(
|
||||||
|
PyObject_GetAttrString(obj.get(), "__name__"));
|
||||||
|
|
||||||
|
// throws if it's not a Python string
|
||||||
|
std::string result(
|
||||||
|
boost::python::expect_non_null(
|
||||||
|
PyString_AsString(p)));
|
||||||
|
|
||||||
|
Py_XDECREF(p); // Done with p
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Demonstrate form 1 of handle_exception
|
||||||
|
//
|
||||||
|
|
||||||
|
// Place a Python Int object whose value is 1 if a and b have
|
||||||
|
// identical "__name__" attributes, 0 otherwise.
|
||||||
|
void same_name_impl(PyObject*& result, PyObject* a, PyObject* b)
|
||||||
|
{
|
||||||
|
result = PyInt_FromLong(
|
||||||
|
get_name(boost::python::ref(a1)) == get_name(boost::python::ref(a2)));
|
||||||
|
}
|
||||||
|
|
||||||
|
// This is an example Python 'C' API interface function
|
||||||
|
extern "C" PyObject*
|
||||||
|
same_name(PyObject* args, PyObject* keywords)
|
||||||
|
{
|
||||||
|
PyObject* a1;
|
||||||
|
PyObject* a2;
|
||||||
|
PyObject* result = 0;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, const_cast<char*>("OO"), &a1, &a2))
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
// Use boost::bind to make an object compatible with
|
||||||
|
// boost::Function0<void>
|
||||||
|
if (boost::python::handle_exception(
|
||||||
|
boost::bind<void>(same_name_impl, boost::ref(result), a1, a2)))
|
||||||
|
{
|
||||||
|
// an exception was thrown; the Python error was set by
|
||||||
|
// handle_exception()
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//
|
||||||
|
// Demonstrate form 2 of handle_exception. Not well-supported by all
|
||||||
|
// compilers.
|
||||||
|
//
|
||||||
|
extern "C" PyObject*
|
||||||
|
same_name2(PyObject* args, PyObject* keywords)
|
||||||
|
{
|
||||||
|
PyObject* a1;
|
||||||
|
PyObject* a2;
|
||||||
|
PyObject* result = 0;
|
||||||
|
|
||||||
|
if (!PyArg_ParseTuple(args, const_cast<char*>("OO"), &a1, &a2))
|
||||||
|
return 0;
|
||||||
|
try {
|
||||||
|
return PyInt_FromLong(
|
||||||
|
get_name(boost::python::ref(a1)) == get_name(boost::python::ref(a2)));
|
||||||
|
}
|
||||||
|
catch(...)
|
||||||
|
{
|
||||||
|
// If an exception was thrown, translate it to Python
|
||||||
|
boost::python::handle_exception();
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
17 November, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
39
doc/v2/faq.html
Normal file
39
doc/v2/faq.html
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
<title>Boost.Python - FAQ</title>
|
||||||
|
</head>
|
||||||
|
<body link="#0000ff" vlink="#800080">
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
<h2 align="center">Frequently Asked Questions (FAQs)</h2>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#question1">{{question}}</a></dt>
|
||||||
|
<dt><a href="#question2">{{question}}</a></dt>
|
||||||
|
</dl>
|
||||||
|
<h2><a name="question1"></a>{{question}}</h2>
|
||||||
|
<p>{{answer}}</p>
|
||||||
|
<h2><a name="question2"></a>{{question}}</h2>
|
||||||
|
<p>{{answer}}</p>
|
||||||
|
<hr>
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
05 November, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
</p>
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave Abrahams</a>
|
||||||
|
2002. All Rights Reserved.</i></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
366
doc/v2/feb2002.html
Normal file
366
doc/v2/feb2002.html
Normal file
@@ -0,0 +1,366 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta http-equiv="Content-Type" content=
|
||||||
|
"text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - February 2002 Progress Report</title>
|
||||||
|
<style type="text/css">
|
||||||
|
:link { color: #0000ff }
|
||||||
|
:visited { color: #800080 }
|
||||||
|
p.c3 {font-style: italic}
|
||||||
|
h2.c2 {text-align: center}
|
||||||
|
h1.c1 {text-align: center}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width=
|
||||||
|
"100%" summary="header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 class="c1">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 class="c2">February 2002 Progress Report</h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="#Python10">Python10 Conference Report</a>
|
||||||
|
|
||||||
|
<dt><a href="#progress">Boost.Python v2 Progress</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="#documentation">Documentation</a>
|
||||||
|
|
||||||
|
<dt><a href="#conversion">Overhaul of
|
||||||
|
<code>to_python</code>/<code>from_python</code>
|
||||||
|
conversion mechanism</a>
|
||||||
|
|
||||||
|
<dt><a href="#miscellaneous">Miscellaneous</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="Python10">Python10 Conference Report</a></h2>
|
||||||
|
I spent the first week of February at the Python10 conference
|
||||||
|
in Alexandria, VA. I'm including this experience report
|
||||||
|
for two reasons: firstly, it documents where my time was
|
||||||
|
used. Secondly, a public presence for Boost.Python and
|
||||||
|
interaction between the Python and C++ communities is
|
||||||
|
important to the future of Boost.Python, which in turn is
|
||||||
|
important to the Kull Project.
|
||||||
|
|
||||||
|
<p>Andy Koenig, of all people, was the keynote speaker of
|
||||||
|
this year's opening plenary session. He presented his
|
||||||
|
"impressions of a polyglot outsider", which
|
||||||
|
studiously avoided any mention of C++ until the end of his
|
||||||
|
talk, when he was asked about standardization. I was
|
||||||
|
surprised to learn that the C++ community at large wanted a
|
||||||
|
few more years before beginning but when ANSI accepted
|
||||||
|
HP's request for a standard, the process was forced to
|
||||||
|
start: it was a matter of participating or having
|
||||||
|
standardization proceed without one's input. Andy managed
|
||||||
|
to highlight very effectively the balance of strengths in
|
||||||
|
Python, one of the most important being its support for
|
||||||
|
extension via libraries. In many ways that makes Python a
|
||||||
|
good analogue for C++ in the interpreted world
|
||||||
|
|
||||||
|
<p>There were several kind mentions of the Boost.Python
|
||||||
|
library from people who found it indispensable. I was
|
||||||
|
particularly happy that Karl MacMillan, Michael Droettboom,
|
||||||
|
and Ichiro Fujinaga from Johns Hopkins is using it to do OCR
|
||||||
|
on a vast library of music notation, since in a previous life
|
||||||
|
I was an author of music notation software. These guys are
|
||||||
|
also drawing on Ullrich Koethe's VIGRA library for image
|
||||||
|
manipulation (Ullrich has been a major contributor to
|
||||||
|
Boost.Python). They also have a system for writing the
|
||||||
|
Boost.Python wrapper code in C++ comments, which allows them
|
||||||
|
to keep all of the code in one place. I've asked them to
|
||||||
|
send me some information on that.
|
||||||
|
|
||||||
|
<p>The development of Swig has been gaining momentum again
|
||||||
|
(the basic description at
|
||||||
|
www.boost.org/libs/python/doc/comparisons.html still
|
||||||
|
applies). The talk given about it by David Beazly was very
|
||||||
|
well-attended, and they appear to have quite a few users.
|
||||||
|
Swig's strengths (coverage of many langauages) and
|
||||||
|
weaknesses (incomplete C++ language support) haven't
|
||||||
|
changed, although the C++ support seems to have improved
|
||||||
|
considerably - they now claim to have a complete model of the
|
||||||
|
C++ type system. It seems to be mostly geared at wrapping
|
||||||
|
what Walter Landry calls "C-Tran": C++ code which
|
||||||
|
traffics in built-in types with little use of abstraction.
|
||||||
|
I'm not knocking that, either: I'm sure a lot of that
|
||||||
|
code exists, so it's a valuable service. One feature Swig
|
||||||
|
has which I'd like to steal is the ability to unwrap a
|
||||||
|
single Python argument into multiple C++ arguments, for
|
||||||
|
example, by converting a Python string into a pointer and
|
||||||
|
length. When his talk was over, David approached me about a
|
||||||
|
possible joint workshop on language binding, which sounds
|
||||||
|
like a fun idea to me.
|
||||||
|
|
||||||
|
<p>I spent some considerable time talking with Steven Knight,
|
||||||
|
the leader of the Scons build tool effort. We had a lot to
|
||||||
|
share with one another, and I gained a much better
|
||||||
|
appreciation for many of the Scons design decisions. Scons
|
||||||
|
seems to be concentrating on being the ultimate build system
|
||||||
|
substrate, and Steve seemed to think that we were on the
|
||||||
|
right track with our high-level design. We both hope that the
|
||||||
|
Boost.Build V2 high-level architecture can eventually be
|
||||||
|
ported to run on top of Scons.
|
||||||
|
|
||||||
|
<p>They also have a highly-refined and successful development
|
||||||
|
procedure which I'd like to emulate for Boost.Build V2.
|
||||||
|
Among many other things they do, their source-control system
|
||||||
|
automatically ensures that when you check in a new test, it
|
||||||
|
is automatically run on the currently checked-in state of the
|
||||||
|
code, and is expected to fail -- a relatively obvious good
|
||||||
|
idea which I've never heard before.
|
||||||
|
|
||||||
|
<p>Guido Van Rossum's "State of the Python
|
||||||
|
Union" address was full of questions for the community
|
||||||
|
about what should be done next, but the one idea Guido seemed
|
||||||
|
to stress was that core language stability and continuing
|
||||||
|
library development would be a good idea (sound familiar?) I
|
||||||
|
mentioned the Boost model as a counterpoint to the idea of
|
||||||
|
something like CPAN (the massive Perl library archives), and
|
||||||
|
it seemed to generate some significant interest. I've
|
||||||
|
offered to work with anyone from the Python community who
|
||||||
|
wants to set up something like Boost.
|
||||||
|
|
||||||
|
<p>There was some discussion of "string
|
||||||
|
interpolation" (variable substitution in strings), and
|
||||||
|
Guido mentioned that he had some thoughts about the
|
||||||
|
strengths/weaknesses of Python's formatting interface. It
|
||||||
|
might be useful for those working on formatting for boost to
|
||||||
|
contact him and find out what he has to say.
|
||||||
|
|
||||||
|
<p>Ka-Ping Yee demoed a Mailman discussion thread weaver.
|
||||||
|
This tool weaves the various messages in a discussion thread
|
||||||
|
into a single document so you can follow the entire
|
||||||
|
conversation. Since we're looking very seriously at
|
||||||
|
moving Boost to Mailman, this could be a really useful thing
|
||||||
|
for us to have. If we do this, we'll move the yahoogroups
|
||||||
|
discussions into the mailman archive so old discussions can
|
||||||
|
be easily accessed in the same fashion.
|
||||||
|
|
||||||
|
<p>And, just because it's cool, though perhaps not
|
||||||
|
relevant: http://homepages.ulb.ac.be/~arigo/psyco/ is a
|
||||||
|
promising effort to accelerate the execution of Python code
|
||||||
|
to speeds approaching those of compiled languages. It
|
||||||
|
reminded me a lot of Todd Veldhuizen's research into
|
||||||
|
moving parts of C++ template compilation to runtime, only
|
||||||
|
coming from the opposite end of things.
|
||||||
|
|
||||||
|
<h2><a name="progress">Boost.Python v2 Progress</a></h2>
|
||||||
|
Here's what actually got accomplished.
|
||||||
|
|
||||||
|
<h3><a name="documentation">Documentation</a></h3>
|
||||||
|
|
||||||
|
<p>My first priority upon returning from Python10 was to get
|
||||||
|
some documentation in place. After wasting an unfortunate
|
||||||
|
amount of time looking at automatic documentation tools which
|
||||||
|
don't quite work, I settled down to use Bill Kempf's
|
||||||
|
HTML templates designed to be a boost standard. While they
|
||||||
|
are working well, it is highly labor-intensive.
|
||||||
|
|
||||||
|
<p>I decided to begin with the high-level reference material,
|
||||||
|
as opposed to tutorial, narrative, or nitty-gritty details of
|
||||||
|
the framework. It seemed more important to have a precise
|
||||||
|
description of the way the commonly-used components work than
|
||||||
|
to have examples in HTML (since we already have some test
|
||||||
|
modules), and since the low-level details are much
|
||||||
|
less-frequently needed by users it made sense for me to
|
||||||
|
simply respond to support requests for the time being.
|
||||||
|
|
||||||
|
<p>After completing approximately 60% of the high-level docs
|
||||||
|
(currently checked in to libs/python/doc/v2), I found myself
|
||||||
|
ready to start documenting the mechanisms for creating
|
||||||
|
to-/from-python converters. This caused a dilemma: I had
|
||||||
|
realized during the previous week that a much simpler,
|
||||||
|
more-efficient, and easier-to-use implementation was
|
||||||
|
possible, but I hadn't planned on implementing it right
|
||||||
|
away, since what was already in place worked adequately. I
|
||||||
|
had also received my first query on the C++-sig about how to
|
||||||
|
write such a converter
|
||||||
|
|
||||||
|
<p>Given the labor-intensive nature of documentation writing,
|
||||||
|
I decided it would be a bad idea to document the conversion
|
||||||
|
mechanism if I was just going to rewrite it. Often the best
|
||||||
|
impetus for simplifying a design is the realization that
|
||||||
|
understandably documenting its current state would be too
|
||||||
|
difficult, and this was no exception.
|
||||||
|
|
||||||
|
<h3><a name="conversion">Overhaul of
|
||||||
|
<code>to_python</code>/<code>from_python</code> conversion
|
||||||
|
mechanism</a></h3>
|
||||||
|
|
||||||
|
<p>There were two basic realizations involved here:
|
||||||
|
|
||||||
|
<ol>
|
||||||
|
<li><code>to_python</code> conversion could be a one-step
|
||||||
|
process, once an appropriate conversion function is found.
|
||||||
|
This allows elimination of the separate indirect
|
||||||
|
convertibility check
|
||||||
|
|
||||||
|
<li>There are basically two categories of from_python
|
||||||
|
conversions: those which lvalues stored within or held by
|
||||||
|
the Python object (essentially extractions), like what
|
||||||
|
happens when an instance of a C++ class exposed with class_
|
||||||
|
is used as the target of a wrapped member function), and
|
||||||
|
those in which a new rvalue gets created, as when a Python
|
||||||
|
Float is converted to a C++
|
||||||
|
<code>complex<double></code> or a Python tuple is
|
||||||
|
converted to a C++ <code>std::vector<></code>. From
|
||||||
|
the client side, there are two corresponding categories of
|
||||||
|
conversion: those which demand an lvalue conversion and
|
||||||
|
those which can accept an lvalue or an rvalue conversion.
|
||||||
|
</ol>
|
||||||
|
The latter realization allowed the following collapse, which
|
||||||
|
considerably simplified things:
|
||||||
|
|
||||||
|
<blockquote>
|
||||||
|
<table border="1" summary="Conversion protocol">
|
||||||
|
<tr>
|
||||||
|
<th>Target Type
|
||||||
|
|
||||||
|
<th>Eligible Converters
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>T</code>
|
||||||
|
|
||||||
|
<td rowspan="5"><code>T</code> rvalue or lvalue
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>T const</code>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>T volatile</code>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>T const volatile</code>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>T const&</code>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>T const*</code>
|
||||||
|
|
||||||
|
<td rowspan="9"><code>T</code> lvalue
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>T volatile*</code>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>T const volatile*</code>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>T&</code>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>T volatile&</code>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>T const volatile&</code>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>T* const&</code>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>T const* const&</code>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>T volatile*const&</code>
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>T const volatile*const&</code>
|
||||||
|
</table>
|
||||||
|
</blockquote>
|
||||||
|
This job included the following additional enhancements:
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Elimination of virtual functions, which cause object
|
||||||
|
code bloat
|
||||||
|
|
||||||
|
<li>Registration of a single converter function for all
|
||||||
|
lvalue conversions, two for all rvalue conversions
|
||||||
|
|
||||||
|
<li>Killed lots of unneeded code
|
||||||
|
|
||||||
|
<li>Increased opacity of registry interface
|
||||||
|
|
||||||
|
<li>Eliminated all need for decorated runtime type
|
||||||
|
identifiers
|
||||||
|
|
||||||
|
<li>Updated test modules to reflect new interface
|
||||||
|
|
||||||
|
<li>Eliminated the need for users to worry about converter
|
||||||
|
lifetime issues Additional Builtin Conversion Enhancements
|
||||||
|
|
||||||
|
<li>Support for complex<float>,
|
||||||
|
complex<double>, and complex<long double>
|
||||||
|
conversions
|
||||||
|
|
||||||
|
<li>Support for bool conversions
|
||||||
|
|
||||||
|
<li>NULL pointers representable by None in Python
|
||||||
|
|
||||||
|
<li>Support for conversion of Python classic classes to
|
||||||
|
numeric types
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<h3><a name="miscellaneous">Miscellaneous</a></h3>
|
||||||
|
These don't fit easily under a large heading:
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<li>Support CallPolicies for class member functions
|
||||||
|
|
||||||
|
<li>from_python_data.hpp: revamped type alignment
|
||||||
|
metaprogram so that it's fast enough for KCC
|
||||||
|
|
||||||
|
<li>classfwd.hpp header forward-declares class_<T>
|
||||||
|
|
||||||
|
<li>indirect_traits.hpp:
|
||||||
|
|
||||||
|
<li>added is_pointer_to_reference
|
||||||
|
|
||||||
|
<li>fixed bugs
|
||||||
|
|
||||||
|
<li>Reduced recompilation dependencies
|
||||||
|
|
||||||
|
<li>msvc_typeinfo works around broken MS/Intel typeid()
|
||||||
|
implementation
|
||||||
|
|
||||||
|
<li>Many fixes and improvements to the type_traits library
|
||||||
|
in order to work around compiler bugs and suppress warnings
|
||||||
|
|
||||||
|
<li>Eliminated the need for explicit acquisition of
|
||||||
|
converter registrations
|
||||||
|
|
||||||
|
<li>Expanded constructor support to 6 arguments
|
||||||
|
|
||||||
|
<li>Implemented generalized pointer lifetime support
|
||||||
|
|
||||||
|
<li>Updated code generation for returning.hpp
|
||||||
|
|
||||||
|
<li>Tracked down and fixed cycle GC bugs
|
||||||
|
|
||||||
|
<li>Added comprehensive unit tests for destroy_reference,
|
||||||
|
pointer_type_id, select_from_python, complex<T>,
|
||||||
|
bool, and classic class instance conversions
|
||||||
|
</ul>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
4 April, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p class="c3">© Copyright <a href=
|
||||||
|
"../../../../people/dave_abrahams.htm">Dave Abrahams</a>
|
||||||
|
2002. All Rights Reserved.
|
||||||
|
|
||||||
166
doc/v2/from_python.html
Normal file
166
doc/v2/from_python.html
Normal file
@@ -0,0 +1,166 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - <boost/python/from_python.hpp></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Header <boost/python/from_python.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a>
|
||||||
|
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#from_python-spec">Class
|
||||||
|
Template<code>from_python</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#from_python-spec-synopsis">Class Template
|
||||||
|
<code>from_python</code> synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#from_python-spec-ctors">Class Template
|
||||||
|
<code>from_python</code> constructor</a>
|
||||||
|
|
||||||
|
<dt><a href="#from_python-spec-observers">Class Template
|
||||||
|
<code>from_python</code> observer functions</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<p><code><boost/python/from_python.hpp></code> introduces a class
|
||||||
|
template <code>from_python<T></code> for extracting a C++ object of
|
||||||
|
type <code>T</code> from a Python object.
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="from_python-spec"></a>Class Template
|
||||||
|
<code>from_python<class T></code></h3>
|
||||||
|
|
||||||
|
<p><code>from_python<T></code> is the type used internally by
|
||||||
|
Boost.Python to extract C++ function arguments from a Python argument tuple
|
||||||
|
when calling a wrapped function. It can also be used directly to make
|
||||||
|
similar conversions in other contexts.
|
||||||
|
|
||||||
|
<h4><a name="from_python-spec-synopsis"></a>Class Template
|
||||||
|
<code>from_python</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
template <class T>
|
||||||
|
struct from_python : private <a href=
|
||||||
|
"../../../utility/utility.htm#Class noncopyable">boost::noncopyable</a> // Exposition only.
|
||||||
|
// from_python<T> meets the <a href=
|
||||||
|
"NonCopyable.html">NonCopyable</a> requirements
|
||||||
|
{
|
||||||
|
from_python(PyObject*);
|
||||||
|
bool convertible() const;
|
||||||
|
<i>convertible-to-T</i> operator()(PyObject*) const;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="from_python-spec-ctors"></a>Class Template
|
||||||
|
<code>from_python</code> constructor</h4>
|
||||||
|
<pre>
|
||||||
|
from_python(PyObject* p);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>p != 0</code>
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> Constructs a <code>from_python</code> object suitable
|
||||||
|
for extracting a C++ object of type <code>T</code> from <code>p</code>.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h4><a name="from_python-spec-observers"></a>Class Template
|
||||||
|
<code>from_python</code> observer functions</h4>
|
||||||
|
<pre>
|
||||||
|
bool convertible() const;
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Returns:</b> <code>false</code> if the conversion cannot succeed.
|
||||||
|
This indicates that either:
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<ol>
|
||||||
|
<li>No <code>from_python_converter</code> was registered for
|
||||||
|
<code>T</code>, or
|
||||||
|
|
||||||
|
<li>any such converter rejected the constructor argument
|
||||||
|
<code>p</code> by returning <code>0</code> from its
|
||||||
|
<code>convertible()</code> function
|
||||||
|
</ol>
|
||||||
|
Note that conversion may still fail in <code>operator()</code> due to
|
||||||
|
an exception.
|
||||||
|
|
||||||
|
<dt><b>Throws:</b> nothing
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> Because <code>from_python<></code> is used in
|
||||||
|
overload resolution, and throwing an exception can be slow, it is useful
|
||||||
|
to be able to rule out a broad class of unsuccessful conversions without
|
||||||
|
throwing an exception.
|
||||||
|
</dl>
|
||||||
|
<pre>
|
||||||
|
<i>convertible-to-T</i> operator()(PyObject* p) const;
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>*p</code> refers to the same object which was
|
||||||
|
passed to the constructor, and <code>convertible()</code> returns
|
||||||
|
<code>true</code>.
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> performs the conversion
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> an object convertible to <code>T</code>.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example</h2>
|
||||||
|
<pre>
|
||||||
|
#include <string>
|
||||||
|
#include <boost/python/from_python.hpp>
|
||||||
|
|
||||||
|
// If a std::string can be extracted from p, return its
|
||||||
|
// length. Otherwise, return 0.
|
||||||
|
std::size_t length_if_string(PyObject* p)
|
||||||
|
{
|
||||||
|
from_python<std::string> converter(p);
|
||||||
|
if (!converter.convertible())
|
||||||
|
return 0;
|
||||||
|
else
|
||||||
|
return converter(p).size();
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
05 November, 2001
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
217
doc/v2/has_back_reference.html
Normal file
217
doc/v2/has_back_reference.html
Normal file
@@ -0,0 +1,217 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content=
|
||||||
|
"text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python -
|
||||||
|
<boost/python/has_back_reference.hpp></title>
|
||||||
|
<style type="text/css">
|
||||||
|
p.c3 {font-style: italic}
|
||||||
|
h2.c2 {text-align: center}
|
||||||
|
h1.c1 {text-align: center}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width=
|
||||||
|
"100%" summary="header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86"
|
||||||
|
width="277" alt="C++ Boost" src=
|
||||||
|
"../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 class="c1">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 class="c2">Header
|
||||||
|
<boost/python/has_back_reference.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a>
|
||||||
|
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#has_back_reference-spec">Class template
|
||||||
|
<code>has_back_reference</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href=
|
||||||
|
"#has_back_reference-spec-synopsis">Class template
|
||||||
|
<code>has_back_reference</code> synopsis</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example(s)</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<p><code><boost/python/has_back_reference.hpp></code>
|
||||||
|
defines the traits class template
|
||||||
|
<code>has_back_reference<></code>, which can be
|
||||||
|
specialized by the user to indicate that a wrapped class
|
||||||
|
instance holds a <code>PyObject*</code> corresponding to a
|
||||||
|
Python object.
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="has_back_reference-spec"></a>Class template
|
||||||
|
<code>has_back_reference</code></h3>
|
||||||
|
|
||||||
|
<p>A unary metafunction whose <code>value</code> is true iff
|
||||||
|
its argument is a <code>pointer_wrapper<></code>.
|
||||||
|
|
||||||
|
<h4><a name="has_back_reference-spec-synopsis"></a>Class
|
||||||
|
template <code>has_back_reference</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
template<class WrappedClass> class has_back_reference
|
||||||
|
{
|
||||||
|
static <i>unspecified</i> value = false;
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>A "<a href=
|
||||||
|
"../../../../more/generic_programming.html#traits">traits
|
||||||
|
class</a>" which is inspected by Boost.Python to
|
||||||
|
determine how wrapped classes can be constructed.
|
||||||
|
|
||||||
|
<dl class="traits-semantics">
|
||||||
|
|
||||||
|
<dt><code>value</code> is an integral constant convertible
|
||||||
|
to bool of unspecified type.
|
||||||
|
|
||||||
|
<dt>Specializations may substitute a value convertible to
|
||||||
|
<code>true</code> for <code>value</code> iff for each invocation of
|
||||||
|
<code>class_<WrappedClass>::def_init(args<</code><i>type-sequence...</i><code>>())</code>,
|
||||||
|
there exists a corresponding constructor
|
||||||
|
<code>WrappedClass::WrappedClass(PyObject*, </code><i>type-sequence...</i><code>)</code>. If
|
||||||
|
such a specialization exists, the <code>WrappedClass</code>
|
||||||
|
constructors will be called with a "back reference" pointer
|
||||||
|
to the corresponding Python object whenever they are invoked from
|
||||||
|
Python.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example</h2>
|
||||||
|
|
||||||
|
<h3>C++ module definition</h3>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
#include <boost/python/class.hpp>
|
||||||
|
#include <boost/python/module.hpp>
|
||||||
|
#include <boost/python/has_back_reference.hpp>
|
||||||
|
#include <boost/shared_ptr.hpp>
|
||||||
|
|
||||||
|
using namespace boost::python;
|
||||||
|
|
||||||
|
struct X
|
||||||
|
{
|
||||||
|
X(PyObject* self) : m_self(self), m_x(0) {}
|
||||||
|
X(PyObject* self, int x) : m_self(self), m_x(x) {}
|
||||||
|
|
||||||
|
PyObject* self() { return m_self; }
|
||||||
|
int get() { return m_x; }
|
||||||
|
void set(int x) { m_x = x; }
|
||||||
|
|
||||||
|
PyObject* m_self;
|
||||||
|
int x;
|
||||||
|
};
|
||||||
|
|
||||||
|
// specialize has_back_reference for X
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
template <>
|
||||||
|
struct has_back_reference<X>
|
||||||
|
{
|
||||||
|
enum { value = true; }
|
||||||
|
}
|
||||||
|
}}
|
||||||
|
|
||||||
|
struct Y
|
||||||
|
{
|
||||||
|
Y() : m_x(0) {}
|
||||||
|
Y(int x) : m_x(x) {}
|
||||||
|
int get() { return m_x; }
|
||||||
|
void set(int x) { m_x = x; }
|
||||||
|
|
||||||
|
int x;
|
||||||
|
};
|
||||||
|
|
||||||
|
boost::shared_ptr<Y> Y_self(boost::shared_ptr<Y> self) const { return self; }
|
||||||
|
|
||||||
|
BOOST_PYTHON_MODULE_INIT(back_references)
|
||||||
|
{
|
||||||
|
module("back_references")
|
||||||
|
.add(
|
||||||
|
class_<X>("X")
|
||||||
|
.def_init()
|
||||||
|
.def_init(args<int>())
|
||||||
|
.def("self", &X::self)
|
||||||
|
.def("get", &X::get)
|
||||||
|
.def("set", &X::set)
|
||||||
|
)
|
||||||
|
.add(
|
||||||
|
class_<Y, shared_ptr<Y> >("Y")
|
||||||
|
.def_init()
|
||||||
|
.def_init(args<int>())
|
||||||
|
.def("get", &Y::get)
|
||||||
|
.def("set", &Y::set)
|
||||||
|
.def("self", Y_self)
|
||||||
|
)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
The following Python session illustrates that <code>x.self()</code>
|
||||||
|
returns the same Python object on which it is invoked, while
|
||||||
|
<code>y.self()</code> must create a new Python object which refers to
|
||||||
|
the same Y instance.
|
||||||
|
|
||||||
|
<h3>Python code</h3>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
>>> from back_references import *
|
||||||
|
>>> x = X(1)
|
||||||
|
>>> x2 = x.self()
|
||||||
|
>>> x2 is x
|
||||||
|
<b>1</b>
|
||||||
|
>>> (x.get(), x2.get())
|
||||||
|
(1, 1)
|
||||||
|
>>> x.set(10)
|
||||||
|
>>> (x.get(), x2.get())
|
||||||
|
(10, 10)
|
||||||
|
>>>
|
||||||
|
>>>
|
||||||
|
>>> y = Y(2)
|
||||||
|
>>> y2 = y.self()
|
||||||
|
>>> y2 is y
|
||||||
|
<b>0</b>
|
||||||
|
>>> (y.get(), y2.get())
|
||||||
|
(2, 2)
|
||||||
|
>>> y.set(20)
|
||||||
|
>>> (y.get(), y2.get())
|
||||||
|
(20, 20)
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
07 May, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p class="c3">© Copyright <a href=
|
||||||
|
"../../../../people/dave_abrahams.htm">Dave Abrahams</a>
|
||||||
|
2002. All Rights Reserved.
|
||||||
|
|
||||||
288
doc/v2/header.html
Normal file
288
doc/v2/header.html
Normal file
@@ -0,0 +1,288 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - <{{header}}></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Header <{{header}}></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a>
|
||||||
|
|
||||||
|
<dt><a href="#macros">Macros</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#macro-spec">{{macro name}}</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#values">Values</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#value-spec">{{value name}}</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#types">Types</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#type-spec">{{type name}}</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#class-spec">Class <code>{{name}}</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#class-spec-synopsis">Class <code>{{name}}</code> synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#class-spec-ctors">Class <code>{{name}}</code>
|
||||||
|
constructors and destructor</a>
|
||||||
|
|
||||||
|
<dt><a href="#class-spec-comparisons">Class <code>{{name}}</code> comparison functions</a>
|
||||||
|
|
||||||
|
<dt><a href="#class-spec-modifiers">Class <code>{{name}}</code> modifier functions</a>
|
||||||
|
|
||||||
|
<dt><a href="#class-spec-observers">Class <code>{{name}}</code> observer functions</a>
|
||||||
|
|
||||||
|
<dt><a href="#class-spec-statics">Class <code>{{name}}</code> static functions</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#functions">Functions</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#function-spec">{{function name}}</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#objects">Objects</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#object-spec">{{object name}}</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example(s)</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<p>{{Introductory text}}
|
||||||
|
|
||||||
|
<h2><a name="macros"></a>Macros</h2>
|
||||||
|
|
||||||
|
<p><a name="macro-spec"></a>{{Macro specifications}}
|
||||||
|
|
||||||
|
<h2><a name="values"></a>Values</h2>
|
||||||
|
|
||||||
|
<p><a name="value-spec"></a>{{Value specifications}}
|
||||||
|
|
||||||
|
<h2><a name="types"></a>Types</h2>
|
||||||
|
|
||||||
|
<p><a name="type-spec"></a>{{Type specifications}}
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="class-spec"></a>Class <code>{{name}}</code></h3>
|
||||||
|
|
||||||
|
<p>{{class overview text}}
|
||||||
|
|
||||||
|
<h4><a name="class-spec-synopsis"></a>Class <code>{{name}}</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost
|
||||||
|
{
|
||||||
|
class {{name}}
|
||||||
|
{
|
||||||
|
};
|
||||||
|
};
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="class-spec-ctors"></a>Class <code>{{name}}</code> constructors and
|
||||||
|
destructor</h4>
|
||||||
|
<pre>
|
||||||
|
{{constructor}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Postconditions:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Throws:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Complexity:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> {{text}}
|
||||||
|
</dl>
|
||||||
|
<pre>
|
||||||
|
{{destructor}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Postconditions:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Throws:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Complexity:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> {{text}}
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h4><a name="class-spec-comparisons"></a>Class <code>{{name}}</code> comparison
|
||||||
|
functions</h4>
|
||||||
|
<pre>
|
||||||
|
{{function}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Postconditions:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Throws:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Complexity:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> {{text}}
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h4><a name="class-spec-modifiers"></a>Class <code>{{name}}</code> modifier
|
||||||
|
functions</h4>
|
||||||
|
<pre>
|
||||||
|
{{function}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Postconditions:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Throws:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Complexity:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> {{text}}
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h4><a name="class-spec-observers"></a>Class <code>{{name}}</code> observer
|
||||||
|
functions</h4>
|
||||||
|
<pre>
|
||||||
|
{{function}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Postconditions:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Throws:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Complexity:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> {{text}}
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h4><a name="class-spec-statics"></a>Class <code>{{name}}</code> static functions</h4>
|
||||||
|
<pre>
|
||||||
|
{{function}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Postconditions:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Throws:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Complexity:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> {{text}}
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="functions"></a>Functions</h2>
|
||||||
|
<pre>
|
||||||
|
|
||||||
|
|
||||||
|
<a name="function-spec"></a>{{function}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Postconditions:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Throws:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Complexity:</b> {{text}}
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> {{text}}
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="objects"></a>Objects</h2>
|
||||||
|
|
||||||
|
<p><a name="object-spec"></a>{{Object specifications}}
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example(s)</h2>
|
||||||
|
|
||||||
|
<p>{{Example(s)}}
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
05 November, 2001
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
149
doc/v2/implicit.html
Normal file
149
doc/v2/implicit.html
Normal file
@@ -0,0 +1,149 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - <boost/python/implicit.hpp></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Header <boost/python/implicit.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl function="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="#functions">Functions</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl function="page-index">
|
||||||
|
<dt><a href="#implicitly_convertible-spec">Function Template <code>implicitly_convertible</code></a>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<code>implicitly_convertible</code> allows Boost.Python to
|
||||||
|
implicitly take advantage of a C++ implicit or explicit conversion
|
||||||
|
when matching Python objects to C++ argument types.
|
||||||
|
|
||||||
|
<h2><a name="functions"></a>Functions</h2>
|
||||||
|
|
||||||
|
<h3><a name="implicitly_convertible-spec"></a>Function template <code>implicitly_convertible</code></h3>
|
||||||
|
<pre>
|
||||||
|
template <class Source, class Target>
|
||||||
|
void implicitly_convertible();
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<table border="1" summary="implicitly_convertible template parameters">
|
||||||
|
<caption>
|
||||||
|
<b><code>implicitly_convertible</code> template parameters</b><br>
|
||||||
|
</caption>
|
||||||
|
<tr>
|
||||||
|
<th>Parameter
|
||||||
|
<th>Description
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>Source</code>
|
||||||
|
<td>The source type of the implicit conversion
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>Target</code>
|
||||||
|
<td>The target type of the implicit conversion
|
||||||
|
<tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> The expression <code>Target(s)</code>,
|
||||||
|
where <code>s</code> is of type <code>Source</code>, is valid.
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> registers an rvalue <code>from_python</code>
|
||||||
|
converter to <code>Target</code> which can succeed for any
|
||||||
|
<code>PyObject* p</code> iff there exists any registered
|
||||||
|
converter which can produce <code>Source</code> rvalues
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> C++ users expect to be able to take
|
||||||
|
advantage of the same sort of interoperability in Python as they
|
||||||
|
do in C++.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example</h2>
|
||||||
|
|
||||||
|
|
||||||
|
<h3>C++ module definition</h3>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
#include <boost/python/class.hpp>
|
||||||
|
#include <boost/python/implicit.hpp>
|
||||||
|
#include <boost/python/module.hpp>
|
||||||
|
|
||||||
|
using namespace boost::python;
|
||||||
|
|
||||||
|
struct X
|
||||||
|
{
|
||||||
|
X(int x) : v(x) {}
|
||||||
|
operator int() { return v; }
|
||||||
|
int v;
|
||||||
|
};
|
||||||
|
|
||||||
|
int x_value(X const& x)
|
||||||
|
{
|
||||||
|
return x.v;
|
||||||
|
}
|
||||||
|
|
||||||
|
X make_x(int n) { return X(n); }
|
||||||
|
|
||||||
|
BOOST_PYTHON_MODULE_INIT(implicit_ext)
|
||||||
|
{
|
||||||
|
module("implicit_ext")
|
||||||
|
.def("x_value", x_value)
|
||||||
|
.def("make_x", make_x)
|
||||||
|
.add(
|
||||||
|
class_<X>("X")
|
||||||
|
.def_init(args<int>())
|
||||||
|
)
|
||||||
|
;
|
||||||
|
implicitly_convertible<X,int>();
|
||||||
|
implicitly_convertible<int,X>();
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h3>Python code</h3>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
>>> from implicit_ext import *
|
||||||
|
>>> x_value(X(42))
|
||||||
|
42
|
||||||
|
>>> x_value(42)
|
||||||
|
42
|
||||||
|
>>> x = make_x(X(42))
|
||||||
|
>>> x_value(x)
|
||||||
|
42
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
08 May, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
43
doc/v2/index.html
Normal file
43
doc/v2/index.html
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
<title>Boost.Python</title>
|
||||||
|
</head>
|
||||||
|
<body link="#0000ff" vlink="#800080">
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
<h2 align="center">Index</h2>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
<h2>Contents</h2>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="overview.html">Overview</a></dt>
|
||||||
|
<dt><a href="reference.html">Reference</a></dt>
|
||||||
|
<dt><a href="configuration.html">Configuration Information</a></dt>
|
||||||
|
<dt><a href="rationale.html">Rationale</a></dt>
|
||||||
|
<dt><a href="definitions.html">Definitions</a></dt>
|
||||||
|
<dt><a href="faq.html">Frequently Asked Questions (FAQs)</a></dt>
|
||||||
|
<dt><a href="progress_reports.html">Progress Reports</a></dt>
|
||||||
|
<dt><a href="bibliography.html">Bibliography</a></dt>
|
||||||
|
<dt><a href="acknowledgments.html">Acknowledgments</a></dt>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
05 November, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
</p>
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave Abrahams</a>
|
||||||
|
2002. All Rights Reserved.</i></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
209
doc/v2/instance_holder.html
Executable file
209
doc/v2/instance_holder.html
Executable file
@@ -0,0 +1,209 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content=
|
||||||
|
"text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - <boost/python/instance_holder.hpp></title>
|
||||||
|
<style type="text/css">
|
||||||
|
p.c4 {font-style: italic}
|
||||||
|
span.c3 {color: #ff0000}
|
||||||
|
h2.c2 {text-align: center}
|
||||||
|
h1.c1 {text-align: center}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%"
|
||||||
|
summary="header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width=
|
||||||
|
"277" alt="C++ Boost" src="../../../../c++boost.gif" border=
|
||||||
|
"0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 class="c1">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 class="c2">Header <boost/python/instance_holder.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a>
|
||||||
|
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#instance_holder-spec">Class
|
||||||
|
<code>instance_holder</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#instance_holder-spec-synopsis">Class
|
||||||
|
<code>instance_holder</code> synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#instance_holder-spec-ctors">Class
|
||||||
|
<code>instance_holder</code> destructor</a>
|
||||||
|
|
||||||
|
<dt><a href="#instance_holder-spec-modifiers">Class
|
||||||
|
<code>instance_holder</code> modifier functions</a>
|
||||||
|
|
||||||
|
<dt><a href="#instance_holder-spec-observers">Class
|
||||||
|
<code>instance_holder</code> observer functions</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<p><code><boost/python/instance_holder.hpp></code> provides
|
||||||
|
<code>class instance_holder</code>, the base class for types
|
||||||
|
which hold C++ instances of wrapped classes.
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="instance_holder-spec"></a>Class <code>instance_holder</code></h3>
|
||||||
|
|
||||||
|
<p><code>instance_holder</code> is an abstract base class whose
|
||||||
|
concrete derived classes hold C++ class instances within their
|
||||||
|
Python object wrappers. To allow multiple inheritance in Python
|
||||||
|
from C++ class wrappers, each such Python object contains a chain
|
||||||
|
of <code>instance_holder</code>s. When an <code>__init__</code>
|
||||||
|
function for a wrapped C++ class is invoked, a new
|
||||||
|
<code>instance_holder</code> instance is created and installed in
|
||||||
|
the Python object using its <code><a
|
||||||
|
href="#instance_holder-spec-modifiers">install</a></code>()
|
||||||
|
function. Each concrete class derived from
|
||||||
|
<code>instance_holder</code> must provide a <code><a
|
||||||
|
href="#instance_holder-spec-observers">holds</a>()</code>
|
||||||
|
implementation which allows Boost.Python to query it for the
|
||||||
|
type(s) it is holding. In order to support the held type's wrapped
|
||||||
|
constructor(s), the class must also provide constructors that can
|
||||||
|
accept an initial <code>PyObject*</code> argument referring to the
|
||||||
|
owning Python object, and which forward the rest of their
|
||||||
|
arguments to the constructor of the held type. The initial
|
||||||
|
argument is needed to enable virtual function overriding in
|
||||||
|
Python, and may be ignored, depending on the specific
|
||||||
|
<code>instance_holder</code> subclass.
|
||||||
|
|
||||||
|
<h4><a name="instance_holder-spec-synopsis"></a>Class instance_holder
|
||||||
|
synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
class instance_holder : <a href="../../../utility/utility.htm#Class noncopyable">noncopyable</a>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// destructor
|
||||||
|
virtual ~instance_holder();
|
||||||
|
|
||||||
|
// instance_holder modifiers
|
||||||
|
void install(PyObject* inst) throw();
|
||||||
|
|
||||||
|
// instance_holder observers
|
||||||
|
virtual void* holds(type_info) = 0;
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="instance_holder-spec-ctors">Class <code>instance_holder</code>
|
||||||
|
destructor</a></h4>
|
||||||
|
<pre>
|
||||||
|
virtual ~instance_holder();
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Effects:</b> destroys the object
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h4><a name="instance_holder-spec-modifiers">Class
|
||||||
|
<code>instance_holder</code> modifiers</a></h4>
|
||||||
|
<pre>
|
||||||
|
void install(PyObject* inst) throw();
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>inst</code> is a Python instance of a
|
||||||
|
wrapped C++ class type, or is a type derived from a wrapped C++
|
||||||
|
class type.
|
||||||
|
<dt><b>Effects:</b> installs the new instance at the head of the
|
||||||
|
Python object's chain of held instances.
|
||||||
|
<dt><b>Throws:</b> nothing
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h4><a name="instance_holder-spec-observers">Class <code>instance_holder</code>
|
||||||
|
observers</a></h4>
|
||||||
|
<pre>
|
||||||
|
virtual void* holds(type_info x) = 0;
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Returns:</b> A pointer to an object of the type described
|
||||||
|
by <code>x</code> if <code>*this</code> contains such an object,
|
||||||
|
0 otherwise.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example</h2>
|
||||||
|
|
||||||
|
The following is a simplified version of the instance holder template
|
||||||
|
used by Boost.Python to wrap classes held by smart pointers:
|
||||||
|
<pre>
|
||||||
|
template <class SmartPtr, class Value>
|
||||||
|
struct pointer_holder : instance_holder
|
||||||
|
{
|
||||||
|
// construct from the SmartPtr type
|
||||||
|
pointer_holder(SmartPtr p)
|
||||||
|
:m_p(p)
|
||||||
|
|
||||||
|
// Forwarding constructors for the held type
|
||||||
|
pointer_holder(PyObject*)
|
||||||
|
:m_p(new Value())
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class A0>
|
||||||
|
pointer_holder(PyObject*,A0 a0)
|
||||||
|
:m_p(new Value(a0))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
template<class A0,class A1>
|
||||||
|
pointer_holder(PyObject*,A0 a0,A1 a1)
|
||||||
|
:m_p(new Value(a0,a1))
|
||||||
|
{
|
||||||
|
}
|
||||||
|
...
|
||||||
|
|
||||||
|
private: // required holder implementation
|
||||||
|
void* holds(type_info dst_t)
|
||||||
|
{
|
||||||
|
// holds an instance of the SmartPtr type...
|
||||||
|
if (dst_t == python::type_id<SmartPtr>())
|
||||||
|
return &this->m_p;
|
||||||
|
|
||||||
|
// ...and an instance of the SmartPtr's element_type, if the
|
||||||
|
// pointer is non-null
|
||||||
|
return python::type_id<Value>() == dst_t ? &*this->m_p : 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
private: // data members
|
||||||
|
SmartPtr m_p;
|
||||||
|
};
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
29 May, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p class="c4">© Copyright <a href=
|
||||||
|
"../../../../people/dave_abrahams.htm">Dave Abrahams</a> 2002. All
|
||||||
|
Rights Reserved.
|
||||||
|
|
||||||
364
doc/v2/iterator.html
Normal file
364
doc/v2/iterator.html
Normal file
@@ -0,0 +1,364 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - <boost/python/iterator.hpp></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Header <boost/python/iterator.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a>
|
||||||
|
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#iterator-spec">Class template <code>iterator</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#iterator-spec-synopsis">Class
|
||||||
|
<code>iterator</code> synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#iterator-spec-ctors">Class template <code>iterator</code>
|
||||||
|
constructor</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#iterators-spec">Class template <code>iterators</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#iterators-spec-synopsis">Class
|
||||||
|
<code>iterators</code> synopsis</a>
|
||||||
|
<dt><a href="#iterators-spec-types">Class template
|
||||||
|
<code>iterators</code> nested types</a>
|
||||||
|
<dt><a href="#iterators-spec-statics">Class template
|
||||||
|
<code>iterators</code> static functions</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#functions">Functions</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#range-spec">range</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Examples</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<p><code><boost/python/iterator.hpp></code> provides types
|
||||||
|
and functions for creating <a
|
||||||
|
href="http://www.python.org/doc/current/lib/typeiter.html">Python
|
||||||
|
iterators</a> from <a
|
||||||
|
href="http://www.sgi.com/tech/stl/Container.html">C++
|
||||||
|
Containers</a> and <a
|
||||||
|
href="http://www.sgi.com/tech/stl/Iterators.html">Iterators</a>. Note
|
||||||
|
that if your <code>class_</code> supports random-access iterators,
|
||||||
|
implementing
|
||||||
|
<code><a
|
||||||
|
href="http://www.python.org/doc/current/ref/sequence-types.html#l2h-128">__getitem__</a></code>
|
||||||
|
(also known as the Sequence Protocol) may serve you better than
|
||||||
|
using this facility: Python will automatically create an iterator
|
||||||
|
type for you (see <a
|
||||||
|
href="http://www.python.org/doc/current/lib/built-in-funcs.html#l2h-35">iter()</a>),
|
||||||
|
and each access can be range-checked, leaving no possiblity of
|
||||||
|
accessing through an invalidated C++ iterator.
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="iterator-spec"></a>Class Template <code>iterator</code></h3>
|
||||||
|
|
||||||
|
<p>Instances of <code>iterator<C,P></code> hold a reference
|
||||||
|
to a callable Python object which, when invoked from Python,
|
||||||
|
expects a single argument <code>c</code> convertible to
|
||||||
|
<code>C</code> and creates a Python iterator that traverses
|
||||||
|
[<code>c.begin()</code>,
|
||||||
|
<code>c.end()</code>). The optional <a
|
||||||
|
href="CallPolicies.html">CallPolicies</a>
|
||||||
|
<code>P</code> can be used to control how elements are returned
|
||||||
|
during iteration.
|
||||||
|
|
||||||
|
<p>In the table below, <code><b>c</b></code> is an instance of <code>Container</code>.
|
||||||
|
|
||||||
|
<table border="1" summary="iterator template parameters">
|
||||||
|
<tr>
|
||||||
|
<th>Template Parameter
|
||||||
|
|
||||||
|
<th>Requirements
|
||||||
|
|
||||||
|
<th>Semantics
|
||||||
|
|
||||||
|
<th>Default
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>Container</code>
|
||||||
|
|
||||||
|
<td>[c.begin(),c.end()) is a valid <a
|
||||||
|
href="http://www.sgi.com/tech/stl/Iterators.html">Iterator
|
||||||
|
range</a>.
|
||||||
|
|
||||||
|
<td>The result will convert its argument to
|
||||||
|
<code>c</code> and call
|
||||||
|
<code>c.begin()</code> and <code>c.end()</code> to acquire
|
||||||
|
iterators. To invoke <code>Container</code>'s
|
||||||
|
<code>const</code> <code>begin()</code> and <code>end()</code>
|
||||||
|
functions, make it <code>const</code>.
|
||||||
|
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>NextPolicies</code>
|
||||||
|
|
||||||
|
<td>A default-constructible model of <a
|
||||||
|
href="CallPolicies.html#CallPolicies-concept">CallPolicies</a>.
|
||||||
|
|
||||||
|
<td>Applied to the resulting iterators' <code>next()</code> method.
|
||||||
|
|
||||||
|
<td>An unspecified model of <a
|
||||||
|
href="CallPolicies.html#CallPolicies-concept">CallPolicies</a>
|
||||||
|
which always makes a copy of the
|
||||||
|
result of deferencing the underlying C++ iterator
|
||||||
|
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h4><a name="iterator-spec-synopsis"></a>Class Template iterator synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
template <class Container
|
||||||
|
, class NextPolicies = <i>unspecified</i>>
|
||||||
|
struct iterator : reference<PyObject*>
|
||||||
|
{
|
||||||
|
iterator();
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
<h4><a name="iterator-spec-constructors"></a>Class Template
|
||||||
|
iterator constructor</h4>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
iterator()
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Effects:</b> Initializes its base class with the result
|
||||||
|
of:
|
||||||
|
<pre>
|
||||||
|
range<NextPolicies>(&iterators<Container>::begin, &iterators<Container>::end)
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dt><b>Postconditions:</b> <code>this->get()</code> points to
|
||||||
|
a Python callable object which creates a Python iterator as
|
||||||
|
described above.
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> Provides an easy way to create iterators
|
||||||
|
for the common case where a C++ class being wrapped provides
|
||||||
|
<code>begin()</code> and <code>end()</code>.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<!-- -->
|
||||||
|
|
||||||
|
<h3><a name="iterators-spec"></a>Class Template <code>iterators</code></h3>
|
||||||
|
|
||||||
|
<p>A utility class template which provides a way to reliably call
|
||||||
|
its argument's <code>begin()</code> and <code>end()</code> member
|
||||||
|
functions. Note that there is no portable way to take the address
|
||||||
|
of a member function of a C++ standard library container, so
|
||||||
|
<code>iterators<></code> can be particularly helpful when
|
||||||
|
wrapping them.
|
||||||
|
|
||||||
|
|
||||||
|
<p>In the table below, <code><b>x</b></code> is an instance of <code>C</code>.
|
||||||
|
|
||||||
|
<table border="1" summary="iterator template parameters">
|
||||||
|
<tr>
|
||||||
|
<th>Required Valid Expression
|
||||||
|
|
||||||
|
<th>Type
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>x.begin()</code>
|
||||||
|
|
||||||
|
<td>Convertible to <code>C::const_iterator</code> if <code>C</code> is a
|
||||||
|
<code>const</code> type; convertible to <code>C::iterator</code> otherwise.
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>x.end()</code>
|
||||||
|
|
||||||
|
<td>Convertible to <code>C::const_iterator</code> if <code>C</code> is a
|
||||||
|
<code>const</code> type; convertible to <code>C::iterator</code> otherwise.
|
||||||
|
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h4><a name="iterators-spec-synopsis"></a>Class Template iterators synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
template <class C>
|
||||||
|
struct iterators
|
||||||
|
{
|
||||||
|
typedef typename C::[const_]iterator iterator;
|
||||||
|
static iterator begin(C& x);
|
||||||
|
static iterator end(C& x);
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
|
||||||
|
</pre>
|
||||||
|
<h4><a name="iterators-spec-types"></a>Class Template
|
||||||
|
iterators nested types</h4>
|
||||||
|
|
||||||
|
If C is a <code>const</code> type,
|
||||||
|
<pre>
|
||||||
|
typedef typename C::const_iterator iterator;
|
||||||
|
</pre>
|
||||||
|
Otherwise:
|
||||||
|
<pre>
|
||||||
|
typedef typename C::iterator iterator;
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="iterators-spec-statics"></a>Class Template
|
||||||
|
iterators static functions</h4>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
static iterator begin(C&);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Returns:</b> <code>x.begin()</code>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
static iterator end(C&);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Returns:</b> <code>x.end()</code>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<!-- -->
|
||||||
|
|
||||||
|
<h2><a name="functions"></a>Functions</h2>
|
||||||
|
<pre>
|
||||||
|
<a name=
|
||||||
|
"range-spec">template</a> <class NextPolicies, class Target, class Accessor1, class Accessor2>
|
||||||
|
reference<PyObject*> range(Accessor1 start, Accessor2 finish);
|
||||||
|
|
||||||
|
template <class NextPolicies, class Accessor1, class Accessor2>
|
||||||
|
reference<PyObject*> range(Accessor1 start, Accessor2 finish);
|
||||||
|
|
||||||
|
template <class Accessor1, class Accessor2>
|
||||||
|
reference<PyObject*> range(Accessor1 start, Accessor2 finish);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="range-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>NextPolicies</code> is a
|
||||||
|
default-constructible model of <a
|
||||||
|
href="CallPolicies.html#CallPolicies-concept">CallPolicies</a>.
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> <dl>
|
||||||
|
|
||||||
|
The first form creates a Python callable
|
||||||
|
object which, when invoked, converts its argument to a
|
||||||
|
<code>Target</code> object
|
||||||
|
<code>x</code>, and creates a Python iterator which traverses
|
||||||
|
[<code><a
|
||||||
|
href="../../../bind/bind.html">bind</a>(start,_1)(x)</code>, <code><a
|
||||||
|
href="../../../bind/bind.html">bind</a>(finish,_1)(x)</code>),
|
||||||
|
applying <code>NextPolicies</code> to the iterator's
|
||||||
|
<code>next()</code> function.
|
||||||
|
<dd>
|
||||||
|
<dt>The second form is identical to
|
||||||
|
the first, except that <code>Target</code> is deduced from
|
||||||
|
<code>Accessor1</code> as follows:
|
||||||
|
<ol>
|
||||||
|
<li>If <code>Accessor1</code> is a function type,
|
||||||
|
<code>Target</code> is the type of its first argument.
|
||||||
|
<li>If <code>Accessor1</code> is a data member pointer of the
|
||||||
|
form <code>R (T::*)</code>, <code>Target</code> is
|
||||||
|
identical to <code>T</code>.
|
||||||
|
<li>If <code>Accessor1</code> is a member function pointer of
|
||||||
|
the form
|
||||||
|
<code>R (T::*)(</code><i>arguments...</i><code>)</code> <i>cv-opt</i>,
|
||||||
|
where <i>cv-opt</i> is an optional <code>cv-qualifier</code>,
|
||||||
|
<code>Target</code> is identical to <code>T</code>.
|
||||||
|
</ol>
|
||||||
|
<dd>
|
||||||
|
|
||||||
|
<dt>The third form is identical to the second, except that
|
||||||
|
<code>NextPolicies</code> is an unspecified model of <a
|
||||||
|
href="CallPolicies.html#CallPolicies-concept">CallPolicies</a>
|
||||||
|
which always makes a copy of the
|
||||||
|
result of deferencing the underlying C++ iterator<dd>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> The use of <code><a
|
||||||
|
href="../../../bind/bind.html">boost::bind</a>()</code> allows
|
||||||
|
C++ iterators to be accessed through functions, member functions
|
||||||
|
or data member pointers. Customization of
|
||||||
|
<code>NextPolicies</code> (e.g. using <code><a
|
||||||
|
href="return_internal_reference.html#return_internal_reference-spec"
|
||||||
|
>return_internal_reference</a></code>) is useful when it is
|
||||||
|
expensive to copy sequence elements of a wrapped class
|
||||||
|
type. Customization of <code>Target</code> is useful when
|
||||||
|
<code>Accessor1</code> is a function object, or when a base
|
||||||
|
class of the intended target type would otherwise be deduced.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Examples</h2>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
#include <boost/python/module.hpp>
|
||||||
|
#include <boost/python/class.hpp>
|
||||||
|
#include <boost/python/return_internal_reference.hpp>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
using namespace boost::python;
|
||||||
|
BOOST_PYTHON_MODULE_INIT(demo)
|
||||||
|
{
|
||||||
|
module("demo")
|
||||||
|
.add(
|
||||||
|
class_<std::vector<double> >("dvec")
|
||||||
|
.def("__iter__", iterator<std::vector<double> >())
|
||||||
|
...
|
||||||
|
)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
A more comprehensive example can be found in:
|
||||||
|
<code><dl>
|
||||||
|
<dt><a href="../../test/iterator.cpp">libs/python/test/iterator.cpp</a><dd>
|
||||||
|
<dt><a href="../../test/input_iterator.cpp">libs/python/test/input_iterator.cpp</a><dd>
|
||||||
|
<dt><a href="../../test/iterator.py">libs/python/test/input_iterator.py</a><dd>
|
||||||
|
</code>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
17 May, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
283
doc/v2/lvalue_from_pytype.html
Executable file
283
doc/v2/lvalue_from_pytype.html
Executable file
@@ -0,0 +1,283 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - <boost/python/lvalue_from_python.hpp></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Header <boost/python/lvalue_from_pytype.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#lvalue_from_pytype-spec">Class Template <code>lvalue_from_pytype</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
|
||||||
|
<dt><a href="#lvalue_from_pytype-spec-synopsis">Class Template
|
||||||
|
<code>lvalue_from_pytype</code> synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#lvalue_from_pytype-spec-ctors">Class Template
|
||||||
|
<code>lvalue_from_pytype</code> constructor</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#extract_identity-spec">Class Template <code>extract_identity</code></a>
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
|
||||||
|
<dt><a href="#extract_identity-spec-synopsis">Class Template
|
||||||
|
<code>extract_identity</code> synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#extract_identity-spec-statics">Class Template
|
||||||
|
<code>extract_identity</code> static functions</a>
|
||||||
|
</dl>
|
||||||
|
<dt><a href="#extract_member-spec">Class Template <code>extract_member</code></a>
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
|
||||||
|
<dt><a href="#extract_member-spec-synopsis">Class Template
|
||||||
|
<code>extract_member</code> synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#extract_member-spec-statics">Class Template
|
||||||
|
<code>extract_member</code> static functions</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<code><boost/python/lvalue_from_pytype.hpp></code> supplies
|
||||||
|
a facility for extracting C++ objects from within Python instances
|
||||||
|
of a given type. This is typically useful for dealing with
|
||||||
|
"traditional" Python extension types.
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="lvalue_from_pytype-spec"></a>Class template <code>lvalue_from_pytype</code></h3>
|
||||||
|
|
||||||
|
<p>Class template <code>lvalue_from_pytype</code> will register
|
||||||
|
from_python converters which, given an object of the given Python
|
||||||
|
type, can extract references and pointers to a particular C++
|
||||||
|
type. Its template arguments are:
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
|
||||||
|
<table border="1" summary="lvalue_from_pytype template parameters">
|
||||||
|
<caption>
|
||||||
|
<b><code>lvalue_from_pytype</code> Requirements</b><br>
|
||||||
|
|
||||||
|
In the table below, <b><code>x</code></b> denotes an object of type <code>PythonObject&</code>
|
||||||
|
|
||||||
|
</caption>
|
||||||
|
<tr>
|
||||||
|
<th>Parameter
|
||||||
|
|
||||||
|
<th>Requirements
|
||||||
|
|
||||||
|
<th>Semantics
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>Extractor</code>
|
||||||
|
|
||||||
|
<td>a model of <a
|
||||||
|
href="Extractor.html#Extractor-concept">Extractor</a> whose
|
||||||
|
execute function returns a reference type.
|
||||||
|
|
||||||
|
<td>Extracts the lvalue from the Python object once its type has been confirmed
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>python_type</code>
|
||||||
|
|
||||||
|
<td>A compile-time constant <code><a
|
||||||
|
href="http://www.python.org/doc/2.2/ext/dnt-type-methods.html">PyTypeObject</a>*</code>
|
||||||
|
|
||||||
|
<td>The Python type of instances convertible by this
|
||||||
|
converter. Python subtypes are also convertible.
|
||||||
|
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h4><a name="lvalue_from_pytype-spec-synopsis"></a>Class template <code>lvalue_from_pytype</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
template <class Extractor, PyTypeObject const* python_type>
|
||||||
|
struct lvalue_from_pytype
|
||||||
|
{
|
||||||
|
lvalue_from_pytype();
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="lvalue_from_pytype-spec-ctors"></a>Class template <code>lvalue_from_pytype</code> constructor</h4>
|
||||||
|
<pre>
|
||||||
|
lvalue_from_pytype();
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> Registers converters which can convert
|
||||||
|
Python objects of the given type to lvalues of the type returned
|
||||||
|
by <code>Extractor::execute</code>.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h3><a name="extract_identity-spec"></a>Class template <code>extract_identity</code></h3>
|
||||||
|
|
||||||
|
<p><code>extract_identity</code> is a model of <a
|
||||||
|
href="Extractor.html#Extractor-concept">Extractor</a> which can be
|
||||||
|
used in the common case where the C++ type to be extracted is the
|
||||||
|
same as the Python object type.
|
||||||
|
|
||||||
|
<h4><a name="extract_identity-spec-synopsis"></a>Class template
|
||||||
|
<code>extract_identity</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
template <class InstanceType>
|
||||||
|
struct extract_identity
|
||||||
|
{
|
||||||
|
static InstanceType& execute(InstanceType& c);
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="extract_identity-spec-statics"></a>Class template <code>extract_identity</code> static functions</h4>
|
||||||
|
<pre>
|
||||||
|
InstanceType& execute(InstanceType& c);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> <code>c</code>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
|
<h3><a name="extract_member-spec"></a>Class template <code>extract_member</code></h3>
|
||||||
|
|
||||||
|
<p><code>extract_member</code> is a model of <a
|
||||||
|
href="Extractor.html#Extractor-concept">Extractor</a> which can be
|
||||||
|
used in the common case in the common case where the C++
|
||||||
|
type to be extracted is a member of the Python object.
|
||||||
|
|
||||||
|
<h4><a name="extract_member-spec-synopsis"></a>Class template <code>extract_member</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
template <class InstanceType, class MemberType, MemberType (InstanceType::*member)>
|
||||||
|
struct extract_member
|
||||||
|
{
|
||||||
|
static MemberType& execute(InstanceType& c);
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="extract_member-spec-statics"></a>Class template <code>extract_member</code> static functions</h4>
|
||||||
|
<pre>
|
||||||
|
static MemberType& execute(InstanceType& c);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> <code>c.*member</code>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example</h2>
|
||||||
|
|
||||||
|
This example presumes that someone has implemented the standard <a
|
||||||
|
href="http://www.python.org/doc/2.2/ext/dnt-basics.html">noddy
|
||||||
|
example module</a> from the Python documentation, and we want to build
|
||||||
|
a module which manipulates <code>Noddy</code>s. Since
|
||||||
|
<code>noddy_NoddyObject</code> is so simple that it carries no
|
||||||
|
interesting information, the example is a bit contrived: it assumes
|
||||||
|
you want to keep track of one particular object for some reason. This
|
||||||
|
module would have to be dynamically linked to the module which defines
|
||||||
|
<code>noddy_NoddyType</code>.
|
||||||
|
|
||||||
|
<h3>C++ module definition</h3>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
#include <boost/python/reference.hpp>
|
||||||
|
#include <boost/python/module.hpp>
|
||||||
|
|
||||||
|
// definition lifted from the Python docs
|
||||||
|
typedef struct {
|
||||||
|
PyObject_HEAD
|
||||||
|
} noddy_NoddyObject;
|
||||||
|
|
||||||
|
using namespace boost::python;
|
||||||
|
static reference<PyObject> cache;
|
||||||
|
|
||||||
|
bool is_cached(noddy_NoddyObject* x)
|
||||||
|
{
|
||||||
|
return x == cache.get();
|
||||||
|
}
|
||||||
|
|
||||||
|
void set_cache(noddy_NoddyObject* x)
|
||||||
|
{
|
||||||
|
cache.reset((PyObject*)x, ref::increment_count);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_PYTHON_MODULE_INIT(noddy_cache)
|
||||||
|
{
|
||||||
|
module noddy_cache("noddy_cache")
|
||||||
|
.def("is_cached", is_cached)
|
||||||
|
.def("set_cache", set_cache)
|
||||||
|
;
|
||||||
|
|
||||||
|
// register Noddy lvalue converter
|
||||||
|
lvalue_from_pytype<extract_identity<noddy_NoddyObject>,&noddy_NoddyType>();
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h3>Python code</h3>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
>>> import noddy
|
||||||
|
>>> n = noddy.new_noddy()
|
||||||
|
>>> import noddy_cache
|
||||||
|
>>> noddy_cache.is_cached(n)
|
||||||
|
0
|
||||||
|
>>> noddy_cache.set_cache(n)
|
||||||
|
>>> noddy_cache.is_cached(n)
|
||||||
|
1
|
||||||
|
>>> noddy_cache.is_cached(noddy.new_noddy())
|
||||||
|
0
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
05 November, 2001
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
155
doc/v2/make_function.html
Normal file
155
doc/v2/make_function.html
Normal file
@@ -0,0 +1,155 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - <boost/python/make_function.hpp></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Header <boost/python/make_function.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a>
|
||||||
|
|
||||||
|
<dt><a href="#functions">Functions</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#make_function-spec">make_function</a>
|
||||||
|
|
||||||
|
<dt><a href="#make_constructor-spec">make_constructor</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<p><code><a href="#make_function-spec">make_function</a>()</code> and
|
||||||
|
<code><a href="#make_constructor-spec">make_constructor</a>()</code> are
|
||||||
|
the functions used internally by <code>class_<>::<a href=
|
||||||
|
"class.html#class_-spec-modifiers">def</a></code>, <code>class_<>::<a
|
||||||
|
href="module.html#module-spec-modifiers">def</a></code>, and
|
||||||
|
<code>class_<>::<a href=
|
||||||
|
"class.html#class_-spec-modifiers">def_init</a></code> to produce Python
|
||||||
|
callable objects which wrap C++ functions and member functions.
|
||||||
|
|
||||||
|
<h2><a name="functions"></a>Functions</h2>
|
||||||
|
<pre>
|
||||||
|
<a name="make_function-spec">template <class F></a>
|
||||||
|
objects::function* make_function(F f)
|
||||||
|
|
||||||
|
template <class F, class Policies>
|
||||||
|
objects::function* make_function(F f, Policies const& policies)
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>F</code> is a function pointer or member
|
||||||
|
function pointer type
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> Creates a Python callable object which, when called
|
||||||
|
from Python, converts its arguments to C++ and calls <code>f</code>. If
|
||||||
|
<code>F</code> is a pointer-to-member-function type, the target object of
|
||||||
|
the function call (<code>*this</code>) will be taken from the first
|
||||||
|
Python argument, and subsequent Python arguments will be used as the
|
||||||
|
arguments to <code>f</code>. If <code>policies</code> are supplied, it
|
||||||
|
must be a model of <a href="CallPolicies.html">CallPolicies</a>, and will
|
||||||
|
be applied to the function as described <a href=
|
||||||
|
"CallPolicies.html">here</a>.
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> A pointer convertible to <code>PyObject*</code> which
|
||||||
|
refers to the new Python callable object.
|
||||||
|
</dl>
|
||||||
|
<pre>
|
||||||
|
<a name=
|
||||||
|
"make_constructor-spec">template <class T, class ArgList, class Generator>
|
||||||
|
objects::function* make_constructor();</a>
|
||||||
|
|
||||||
|
template <class ArgList, class Generator, class Policies>
|
||||||
|
objects::function* make_constructor(Policies const& policies)
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>T</code> is a class
|
||||||
|
type. <code>Policies</code> is a model of <a
|
||||||
|
href="CallPolicies.html">CallPolicies</a>. <code>ArgList</code>
|
||||||
|
is an <a href="../../../mpl/doc/Sequences.html">MPL sequence</a>
|
||||||
|
of C++ argument types (<i>A1, A2,... AN</i>) such that if
|
||||||
|
<code>a1, a2</code>... <code>aN</code> are objects of type
|
||||||
|
<i>A1, A2,... AN</i> respectively, the expression <code>new
|
||||||
|
Generator::apply<T>::type(a1, a2</code>... <code>aN</code>) is
|
||||||
|
valid. Generator is a model of <a href=
|
||||||
|
"HolderGenerator.html">HolderGenerator</a>.
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> Creates a Python callable object which, when called
|
||||||
|
from Python, expects its first argument to be a Boost.Python extension
|
||||||
|
class object. It converts its remaining its arguments to C++ and passes
|
||||||
|
them to the constructor of a dynamically-allocated
|
||||||
|
<code>Generator::apply<T>::type</code> object, which is
|
||||||
|
then installed in the extension class object. In the second
|
||||||
|
form, the <code>policies</code> are applied to the arguments and
|
||||||
|
result (<a
|
||||||
|
href="http://www.python.org/doc/current/lib/bltin-null-object.html">None</a>)
|
||||||
|
of the Python callable object
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> The new Python callable object
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example</h2>
|
||||||
|
|
||||||
|
<p>C++ function exposed below returns a callable object wrapping one of two
|
||||||
|
functions.
|
||||||
|
<pre>
|
||||||
|
#include <boost/python/make_function.hpp>
|
||||||
|
#include <boost/python/module.hpp>
|
||||||
|
|
||||||
|
char const* foo() { return "foo"; }
|
||||||
|
char const* bar() { return "bar"; }
|
||||||
|
|
||||||
|
PyObject* choose_function(bool selector)
|
||||||
|
{
|
||||||
|
if (selector)
|
||||||
|
return boost::python::make_function(foo);
|
||||||
|
else
|
||||||
|
return boost::python::make_function(bar);
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_PYTHON_MODULE_INIT(make_function_test)
|
||||||
|
{
|
||||||
|
module("make_function_test")
|
||||||
|
.def("choose_function", choose_function);
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
It can be used this way in Python:
|
||||||
|
<pre>
|
||||||
|
>>> from make_function_test import *
|
||||||
|
>>> f = choose_function(1)
|
||||||
|
>>> g = choose_function(0)
|
||||||
|
>>> f()
|
||||||
|
'foo'
|
||||||
|
>>> g()
|
||||||
|
'bar'
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
14 February 2002 <!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
130
doc/v2/manage_new_object.html
Normal file
130
doc/v2/manage_new_object.html
Normal file
@@ -0,0 +1,130 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - <boost/python/manage_new_object.hpp></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Header
|
||||||
|
<boost/python/manage_new_object.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#manage_new_object-spec">Class
|
||||||
|
<code>manage_new_object</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#manage_new_object-spec-synopsis">Class
|
||||||
|
<code>manage_new_object</code> synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#manage_new_object-spec-metafunctions">Class
|
||||||
|
<code>manage_new_object</code> metafunctions</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="manage_new_object-spec"></a>Class
|
||||||
|
<code>manage_new_object</code></h3>
|
||||||
|
|
||||||
|
<p><code>manage_new_object</code> is a model of <a href=
|
||||||
|
"ResultConverter.html#ResultConverterGenerator-concept">ResultConverterGenerator</a> which can be
|
||||||
|
used to wrap C++ functions which return a pointer to an object allocated
|
||||||
|
with a <i>new-expression</i>, and expect the caller to take responsibility
|
||||||
|
for deleting that object.
|
||||||
|
|
||||||
|
<h4><a name="manage_new_object-spec-synopsis"></a>Class
|
||||||
|
<code>manage_new_object</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
struct manage_new_object
|
||||||
|
{
|
||||||
|
template <class T> struct apply;
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="manage_new_object-spec-metafunctions"></a>Class
|
||||||
|
<code>manage_new_object</code> metafunctions</h4>
|
||||||
|
<pre>
|
||||||
|
template <class T> struct apply
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="metafunction-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>T</code> is <code>U*</code> for some
|
||||||
|
<code>U</code>.
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> <code>typedef <a href=
|
||||||
|
"to_python_indirect.html#to_python_indirect-spec">to_python_indirect</a><T>
|
||||||
|
type;</code>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example</h2>
|
||||||
|
|
||||||
|
<p>In C++:
|
||||||
|
<pre>
|
||||||
|
#include <boost/python/module.hpp>
|
||||||
|
#include <boost/python/class.hpp>
|
||||||
|
#include <boost/python/manage_new_object.hpp>
|
||||||
|
#include <boost/python/return_value_policy.hpp>
|
||||||
|
|
||||||
|
|
||||||
|
struct Foo {
|
||||||
|
Foo(int x) : x(x){}
|
||||||
|
int get_x() { return x; }
|
||||||
|
int x;
|
||||||
|
};
|
||||||
|
|
||||||
|
Foo* make_foo(int x) { return new Foo(x); }
|
||||||
|
|
||||||
|
// Wrapper code
|
||||||
|
using namespace boost::python;
|
||||||
|
BOOST_PYTHON_MODULE_INIT(my_module)
|
||||||
|
{
|
||||||
|
module("my_module")
|
||||||
|
.def("make_foo", make_foo, return_value_policy<manage_new_object>)
|
||||||
|
.add(
|
||||||
|
class_<Foo>()
|
||||||
|
.def("get_x", &Foo::get_x)
|
||||||
|
)
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
In Python:
|
||||||
|
<pre>
|
||||||
|
>>> from my_module import *
|
||||||
|
>>> f = make_foo(3) # create a Foo object
|
||||||
|
>>> f.get_x()
|
||||||
|
3
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
14 February 2002 <!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
263
doc/v2/module.html
Normal file
263
doc/v2/module.html
Normal file
@@ -0,0 +1,263 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - <boost/python/module.hpp></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Header <boost/python/module.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a>
|
||||||
|
|
||||||
|
<dt><a href="#macros">Macros</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href=
|
||||||
|
"#BOOST_PYTHON_MODULE_INIT-spec">BOOST_PYTHON_MODULE_INIT</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#module-spec">Class <code>module</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#module-spec-synopsis">Class <code>module</code>
|
||||||
|
synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#module-spec-ctors">Class <code>module</code>
|
||||||
|
constructor</a>
|
||||||
|
|
||||||
|
<dt><a href="#module-spec-modifiers">Class <code>module</code>
|
||||||
|
modifier functions</a>
|
||||||
|
|
||||||
|
<dt><a href="#module-spec-observers">Class <code>module</code>
|
||||||
|
observer functions</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example(s)</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<p>This header provides the basic facilities needed to create an
|
||||||
|
extension module.
|
||||||
|
|
||||||
|
<h2><a name="macros"></a>Macros</h2>
|
||||||
|
|
||||||
|
<p><a name=
|
||||||
|
"BOOST_PYTHON_MODULE_INIT-spec"><code>BOOST_PYTHON_MODULE_INIT(name)</code></a>
|
||||||
|
is used to declare Python <a href=
|
||||||
|
"http://www.python.org/doc/2.2/ext/methodTable.html#SECTION003400000000000000000">
|
||||||
|
module initialization functions</a>. The <code>name</code> argument must
|
||||||
|
exactly match the name of the module to be initialized, and must conform to
|
||||||
|
Python's <a href=
|
||||||
|
"http://www.python.org/doc/2.2/ref/identifiers.html">identifier naming
|
||||||
|
rules</a>. Where you would normally write
|
||||||
|
<pre>
|
||||||
|
void init<i>name</i>()
|
||||||
|
{
|
||||||
|
...
|
||||||
|
</pre>
|
||||||
|
Boost.Python modules should be initialized with
|
||||||
|
<pre>
|
||||||
|
BOOST_PYTHON_MODULE_INIT(<i>name</i>)
|
||||||
|
{
|
||||||
|
...
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="module-spec">Class <code>module</code></a></h3>
|
||||||
|
|
||||||
|
<p>This class represents the Python extension module under construction. It
|
||||||
|
provides functions for adding attributes and for retrieving the underlying
|
||||||
|
Python module object.
|
||||||
|
|
||||||
|
<h4><a name="module-spec-synopsis"></a>Class <code>module</code>
|
||||||
|
synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
class module : public module_base
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
module(const char* name);
|
||||||
|
|
||||||
|
// modifier functions
|
||||||
|
module& setattr(const char* name, PyObject*);
|
||||||
|
module& setattr(const char* name, PyTypeObject*);
|
||||||
|
module& setattr(const char* name, ref const&);
|
||||||
|
|
||||||
|
module& add(PyTypeObject* x);
|
||||||
|
template <class T, class Bases, class HolderGenerator>
|
||||||
|
module& add(class_<T,Bases,HolderGenerator> const& c);
|
||||||
|
|
||||||
|
template <class Fn>
|
||||||
|
module& def(char const* name, Fn fn);
|
||||||
|
template <class Fn, class ResultHandler>
|
||||||
|
module& def(char const* name, Fn fn, ResultHandler handler);
|
||||||
|
|
||||||
|
// observer function
|
||||||
|
ref object() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="module-spec-ctors">Class <code>module</code></a>
|
||||||
|
constructor</h4>
|
||||||
|
<pre>
|
||||||
|
module(const char* name);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>name</code> is a ntbs whose value matches the
|
||||||
|
argument passed to <a href=
|
||||||
|
"#BOOST_PYTHON_MODULE_INIT-spec">BOOST_PYTHON_MODULE_INIT</a>.
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> Creates a <code>module</code> object representing a
|
||||||
|
Python module named <code>name</code>.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h4><a name="module-spec-modifiers">Class <code>module</code></a> modifier
|
||||||
|
functions</h4>
|
||||||
|
<pre>
|
||||||
|
module& setattr(const char* name, PyObject* obj);
|
||||||
|
module& setattr(const char* name, PyTypeObject* obj);
|
||||||
|
module& setattr(const char* name, ref const& r);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>name</code> is a ntbs which conforms to
|
||||||
|
Python's <a href=
|
||||||
|
"http://www.python.org/doc/2.2/ref/identifiers.html">identifier
|
||||||
|
naming rules</a>. In the first two forms, <code>obj</code> is non-null.
|
||||||
|
In the third form, <code>r.get()</code> is non-null.
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> Adds the given Python object to the module. If the
|
||||||
|
object is a product of <code><a href=
|
||||||
|
"make_function.html#make_function-spec">make_function</a>()</code>, the
|
||||||
|
usual <a href="overloading.html">overloading procedure</a> applies.
|
||||||
|
In the first two forms, ownership of a reference to obj is transferred
|
||||||
|
from caller to callee, even if an exception is thrown.
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> <code>*this</code>
|
||||||
|
</dl>
|
||||||
|
<pre>
|
||||||
|
module& add(PyTypeObject* x);
|
||||||
|
|
||||||
|
template <class T, class Bases, class HolderGenerator>
|
||||||
|
module& add(class_<T,Bases,HolderGenerator> const& c);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> In the first form, <code>x</code> is non-null
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> The first form adds the Python type object named by
|
||||||
|
<code>x</code> to the Python module under construction, with the name
|
||||||
|
given by the type's <code><a href=
|
||||||
|
"http://www.python.org/doc/2.2/ext/dnt-type-methods.html">tp_name</a></code>
|
||||||
|
field. The second form adds the extension class object being constructed
|
||||||
|
by <code>c</code> to the module, with the same name that was passed to
|
||||||
|
<code>c</code>'s constructor.
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> <code>*this</code>
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> Provides a way to set type attributes in the module
|
||||||
|
without having to explicitly specify the name.
|
||||||
|
</dl>
|
||||||
|
<pre>
|
||||||
|
template <class Fn>
|
||||||
|
module& def(char const* name, Fn f);
|
||||||
|
|
||||||
|
template <class Fn, class ResultHandler>
|
||||||
|
module& def(char const* name, Fn f, ResultHandler handler);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
|
||||||
|
<dt><b>Requires:</b> <code>f</code> is a non-null pointer-to-function or
|
||||||
|
pointer-to-member-function. <code>name</code> is a ntbs which conforms to
|
||||||
|
Python's <a href=
|
||||||
|
"http://www.python.org/doc/2.2/ref/identifiers.html">identifier
|
||||||
|
naming rules</a>. In the first form, the return type of
|
||||||
|
<code>f</code> is not a reference and is not a pointer other
|
||||||
|
than <code>char const*</code> or <code>PyObject*</code>. In the
|
||||||
|
second form <code>policy</code> is a model of <a
|
||||||
|
href="CallPolicy.html">CallPolicy</a>.
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> Adds the result of <code><a href=
|
||||||
|
"make_function.html#make_function-spec">make_function</a>(f)</code> to
|
||||||
|
the extension module being defined, with the given <code>name</code>. If
|
||||||
|
the module already has an attribute named <code><i>name</i></code>, the
|
||||||
|
usual <a href="http:overloading.html">overloading procedure</a> applies.
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> <code>*this</code>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h4><a name="module-spec-observers">Class <code>module</code></a> observer
|
||||||
|
functions</h4>
|
||||||
|
<pre>
|
||||||
|
ref object() const;
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Returns:</b> A <code>ref</code> object which holds a reference to
|
||||||
|
the Python module object created by the <code>module</code> constructor.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example(s)</h2>
|
||||||
|
|
||||||
|
<p>C++ module definition:
|
||||||
|
<pre>
|
||||||
|
#include <boost/python/module.hpp>
|
||||||
|
|
||||||
|
char const* greet()
|
||||||
|
{
|
||||||
|
return "hello, Boost.Python!";
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_PYTHON_MODULE_INIT(boost_greet)
|
||||||
|
{
|
||||||
|
module("boost_greet")
|
||||||
|
.def("greet", greet);
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
Interactive Python:
|
||||||
|
<pre>
|
||||||
|
>>> import boost_greet
|
||||||
|
>>> boost_greet.greet()
|
||||||
|
'hello, Boost.Python!'
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
14 February, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
531
doc/v2/operators.html
Executable file
531
doc/v2/operators.html
Executable file
@@ -0,0 +1,531 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - <boost/python/operators.hpp></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Header <boost/python/operators.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a>
|
||||||
|
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
|
||||||
|
<dt><a href="#self_t-spec">Class <code>self_ns::self_t</code></a>
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#self_t-spec-synopsis">Class <code>self_t</code> synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#self_t-spec-inplace">Class <code>self_t</code> inplace operators</a>
|
||||||
|
|
||||||
|
<dt><a href="#self_t-spec-comparisons">Class <code>self_t</code> comparison functions</a>
|
||||||
|
|
||||||
|
<dt><a href="#self_t-spec-ops">Class <code>self_t</code> non-member operations</a>
|
||||||
|
|
||||||
|
<dt><a href="#self_t-spec-value-unary-ops">Class <code>self_t</code> unary operations</a>
|
||||||
|
|
||||||
|
<dt><a href="#self_t-spec-value-value-ops">Class <code>self_t</code> value operations</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#other-spec">Class template <code>other</code></a>
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#other-spec-synopsis">Class <code>other</code> synopsis</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#operator_-spec">Class template <code>operator_</code></a>
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#operator_-spec-synopsis">Class <code>operator_</code> synopsis</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#objects">Objects</a>
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#self-spec">self</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Examples</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<p><code><boost/python/operators.hpp></code> provides types
|
||||||
|
and functions for automatically generating Python <a
|
||||||
|
href="http://www.python.org/doc/ref/specialnames.html">special
|
||||||
|
methods</a> from the corresponding C++ constructs. Most of these
|
||||||
|
constructs are operator expressions, hence the name. To use the
|
||||||
|
facility, substitute the <code><a
|
||||||
|
href="#self-spec">self</a></code> object for an object of the
|
||||||
|
class type being wrapped in the expression to be exposed, and pass
|
||||||
|
the result to <a
|
||||||
|
href="class.html#class_-spec-modifiers">class_<>::def()</a>. Much
|
||||||
|
of what is exposed in this header should be considered part of the
|
||||||
|
implementation, so is not documented in detail here.
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="self_t-spec"></a>Class <code>self_ns::self_t</code></h3>
|
||||||
|
|
||||||
|
<p><code>self_ns::self_t</code> is the actual type of the <a
|
||||||
|
href="#self-spec"><code>self</code></a> object. The library
|
||||||
|
isolates <code>self_t</code> in its own namespace,
|
||||||
|
<code>self_ns</code>, in order to prevent the generalized operator
|
||||||
|
templates which operate on it from being found by
|
||||||
|
argument-dependent lookup in other contexts. This should be
|
||||||
|
considered an implementation detail, since users should never have
|
||||||
|
to mention <code>self_t</code> directly.
|
||||||
|
|
||||||
|
<h4><a name="self_t-spec-synopsis"></a>Class <code>self_ns::self_t</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python { namespace self_ns {
|
||||||
|
{
|
||||||
|
class self_t {};
|
||||||
|
|
||||||
|
// inplace operators
|
||||||
|
template <class T> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator+=(self_t, T);
|
||||||
|
template <class T> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator-=(self_t, T);
|
||||||
|
template <class T> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator*=(self_t, T);
|
||||||
|
template <class T> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator/=(self_t, T);
|
||||||
|
template <class T> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator%=(self_t, T);
|
||||||
|
template <class T> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator>>=(self_t, T);
|
||||||
|
template <class T> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator<<=(self_t, T);
|
||||||
|
template <class T> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator&=(self_t, T);
|
||||||
|
template <class T> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator^=(self_t, T);
|
||||||
|
template <class T> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator|=(self_t, T);
|
||||||
|
|
||||||
|
// comparisons
|
||||||
|
template <class L, class R> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator==(L const&, R const&);
|
||||||
|
template <class L, class R> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator!=(L const&, R const&);
|
||||||
|
template <class L, class R> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator<(L const&, R const&);
|
||||||
|
template <class L, class R> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator>(L const&, R const&);
|
||||||
|
template <class L, class R> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator<=(L const&, R const&);
|
||||||
|
template <class L, class R> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator>=(L const&, R const&);
|
||||||
|
|
||||||
|
// non-member operations
|
||||||
|
template <class L, class R> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator+(L const&, R const&);
|
||||||
|
template <class L, class R> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator-(L const&, R const&);
|
||||||
|
template <class L, class R> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator*(L const&, R const&);
|
||||||
|
template <class L, class R> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator/(L const&, R const&);
|
||||||
|
template <class L, class R> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator%(L const&, R const&);
|
||||||
|
template <class L, class R> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator>>(L const&, R const&);
|
||||||
|
template <class L, class R> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator<<(L const&, R const&);
|
||||||
|
template <class L, class R> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator&(L const&, R const&);
|
||||||
|
template <class L, class R> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator^(L const&, R const&);
|
||||||
|
template <class L, class R> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> operator|(L const&, R const&);
|
||||||
|
template <class L, class R> <a
|
||||||
|
href="#operator_-spec">operator_</a><<i>unspecified</i>> pow(L const&, R const&);
|
||||||
|
|
||||||
|
// unary operations
|
||||||
|
<a href="#operator_-spec">operator_</a><<i>unspecified</i>> operator-(self_t);
|
||||||
|
<a href="#operator_-spec">operator_</a><<i>unspecified</i>> operator+(self_t);
|
||||||
|
<a href="#operator_-spec">operator_</a><<i>unspecified</i>> operator~(self_t);
|
||||||
|
|
||||||
|
// value operations
|
||||||
|
<a href="#operator_-spec">operator_</a><<i>unspecified</i>> int_(self_t);
|
||||||
|
<a href="#operator_-spec">operator_</a><<i>unspecified</i>> long_(self_t);
|
||||||
|
<a href="#operator_-spec">operator_</a><<i>unspecified</i>> float_(self_t);
|
||||||
|
<a href="#operator_-spec">operator_</a><<i>unspecified</i>> complex_(self_t);
|
||||||
|
<a href="#operator_-spec">operator_</a><<i>unspecified</i>> str(self_t);
|
||||||
|
|
||||||
|
}}};
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
The tables below describe the methods generated when the results of
|
||||||
|
the expressions described are passed as arguments to <a
|
||||||
|
href="class.html#class_-spec-modifiers">class_<>::def()</a>.
|
||||||
|
<code><b>x</b></code> is an object of the class type being wrapped.
|
||||||
|
|
||||||
|
|
||||||
|
<h4><a name="self_t-spec-inplace"></a>Class <code>self_t</code> inplace operators</h4>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
In the table below, If <code><b>r</b></code> is an object of type
|
||||||
|
<code><a href="#other-spec">other</a><T></code>,
|
||||||
|
<code><b>y</b></code> is an object of type <code>T</code>; otherwise,
|
||||||
|
<code><b>y</b></code> is an object of the same type as
|
||||||
|
<code><b>r</b></code>.
|
||||||
|
|
||||||
|
<table border="1">
|
||||||
|
<tr>
|
||||||
|
<th>C++ Expression
|
||||||
|
<th>Python Method Name
|
||||||
|
<th>C++ Implementation
|
||||||
|
|
||||||
|
<tr><td><code>self += r</code>
|
||||||
|
<td><code>__iadd__</code>
|
||||||
|
<td><code>x += y</code>
|
||||||
|
|
||||||
|
<tr><td><code>self -= r</code>
|
||||||
|
<td><code>__isub__</code>
|
||||||
|
<td><code>x -= y</code>
|
||||||
|
|
||||||
|
<tr><td><code>self *= r</code>
|
||||||
|
<td><code>__imul__</code>
|
||||||
|
<td><code>x *= y</code>
|
||||||
|
|
||||||
|
<tr><td><code>self /= r</code>
|
||||||
|
<td><code>__idiv__</code>
|
||||||
|
<td><code>x /= y</code>
|
||||||
|
|
||||||
|
<tr><td><code>self %= r</code>
|
||||||
|
<td><code>__imod__</code>
|
||||||
|
<td><code>x %= y</code>
|
||||||
|
|
||||||
|
<tr><td><code>self >>= r</code>
|
||||||
|
<td><code>__irshift__</code>
|
||||||
|
<td><code>x >>= y</code>
|
||||||
|
|
||||||
|
<tr><td><code>self <<= r</code>
|
||||||
|
<td><code>__ilshift__</code>
|
||||||
|
<td><code>x <<= y</code>
|
||||||
|
|
||||||
|
<tr><td><code>self &= r</code>
|
||||||
|
<td><code>__iand__</code>
|
||||||
|
<td><code>x &= y</code>
|
||||||
|
|
||||||
|
<tr><td><code>self ^= r</code>
|
||||||
|
<td><code>__ixor__</code>
|
||||||
|
<td><code>x ^= y</code>
|
||||||
|
|
||||||
|
<tr><td><code>self |= r</code>
|
||||||
|
<td><code>__ior__</code>
|
||||||
|
<td><code>x |= y</code>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h4><a name="self_t-spec-comparisons"></a>Class <code>self_t</code> comparison
|
||||||
|
functions</h4>
|
||||||
|
|
||||||
|
In the tables below, if <code><b>r</b></code> is of type <code><a
|
||||||
|
href="#self_t-spec">self_t</a></code>, <code><b>y</b></code> is an object
|
||||||
|
of the same type as <code>x</code>;
|
||||||
|
<br>
|
||||||
|
if <code><b>l</b></code> or <code><b>r</b></code> is an object of type <code><a
|
||||||
|
href="#other-spec">other</a><T></code>,
|
||||||
|
<code><b>y</b></code> is an object of type <code>T</code>;
|
||||||
|
<br>
|
||||||
|
otherwise, <code><b>y</b></code> is an object of the same type as
|
||||||
|
<code><b>l</b></code> or <code><b>r</b></code>.<br>
|
||||||
|
<code><b>l</b></code>
|
||||||
|
is never of type <code><a href="#self_t-spec">self_t</a></code>.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
The column of <b>Python Expressions</b> illustrates the expressions
|
||||||
|
that will be supported in Python for objects convertible to the types
|
||||||
|
of <code>x</code> and <code>y</code>. The secondary operation arises
|
||||||
|
due to Python's <a
|
||||||
|
href="http://www.python.org/doc/ref/customization.html#l2h-89">reflection
|
||||||
|
rules</a> for rich comparison operators, and are only used when the
|
||||||
|
corresponding operation is not defined as a method of the
|
||||||
|
<code>y</code> object.
|
||||||
|
|
||||||
|
<table border="1">
|
||||||
|
<tr><th>C++ Expression <th>Python Method Name <th>C++ Implementation
|
||||||
|
<th>Python Expressions<br>(primary, secondary)
|
||||||
|
<code>
|
||||||
|
|
||||||
|
<tr><td>self == r <td>__eq__ <td>x == y
|
||||||
|
<td>x == y, y == x
|
||||||
|
|
||||||
|
<tr><td>l == self <td>__eq__ <td>y == x
|
||||||
|
<td>y == x, x == y
|
||||||
|
|
||||||
|
<tr><td>self != r <td>__ne__ <td>x != y
|
||||||
|
<td>x != y, y != x
|
||||||
|
|
||||||
|
<tr><td>l != self <td>__ne__ <td>y != x
|
||||||
|
<td>y != x, x != y
|
||||||
|
|
||||||
|
<tr><td>self < r <td>__lt__ <td>x < y
|
||||||
|
<td>x < y, y > x
|
||||||
|
|
||||||
|
<tr><td>l < self <td>__gt__ <td>y < x
|
||||||
|
<td>y > x, x < y
|
||||||
|
|
||||||
|
<tr><td>self > r <td>__gt__ <td>x > y
|
||||||
|
<td>x > y, y < x
|
||||||
|
|
||||||
|
<tr><td>l > self <td>__lt__ <td>y > x
|
||||||
|
<td>y < x, x > y
|
||||||
|
|
||||||
|
<tr><td>self <= r <td>__le__ <td>x <= y
|
||||||
|
<td>x <= y, y >= x
|
||||||
|
|
||||||
|
<tr><td>l <= self <td>__ge__ <td>y <= x
|
||||||
|
<td>y >= x, x <= y
|
||||||
|
|
||||||
|
<tr><td>self >= r <td>__ge__ <td>x >= y
|
||||||
|
<td>x >= y, y <= x
|
||||||
|
|
||||||
|
<tr><td>l >= self <td>__le__ <td>y >= x
|
||||||
|
<td>y <= x, x >= y
|
||||||
|
|
||||||
|
</code>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
<h4><a name="self_t-spec-ops"></a>Class
|
||||||
|
<code>self_t</code> non-member operations</h4>
|
||||||
|
|
||||||
|
The operations whose names begin with "<code>__r</code>"
|
||||||
|
below will only be called if the left-hand operand does not already
|
||||||
|
support the given operation, as described <a
|
||||||
|
href="http://www.python.org/doc/current/ref/numeric-types.html#l2h-152">here</a>.
|
||||||
|
|
||||||
|
<table border="1">
|
||||||
|
<tr><th>C++ Expression <th>Python Method Name <th>C++ Implementation
|
||||||
|
<code>
|
||||||
|
|
||||||
|
<tr><td>self + r <td>__add__ <td>x + y
|
||||||
|
<tr><td>l + self <td>__radd__ <td>y + x
|
||||||
|
|
||||||
|
<tr><td>self - r <td>__sub__ <td>x - y
|
||||||
|
<tr><td>l - self <td>__rsub__ <td>y - x
|
||||||
|
|
||||||
|
<tr><td>self * r <td>__mul__ <td>x * y
|
||||||
|
<tr><td>l * self <td>__rmul__ <td>y * x
|
||||||
|
|
||||||
|
<tr><td>self / r <td>__div__ <td>x / y
|
||||||
|
<tr><td>l / self <td>__rdiv__ <td>y / x
|
||||||
|
|
||||||
|
<tr><td>self % r <td>__mod__ <td>x % y
|
||||||
|
<tr><td>l % self <td>__rmod__ <td>y % x
|
||||||
|
|
||||||
|
<tr><td>self >> r <td>__rshift__ <td>x >> y
|
||||||
|
<tr><td>l >> self <td>__rrshift__ <td>y >> x
|
||||||
|
|
||||||
|
<tr><td>self << r <td>__lshift__ <td>x << y
|
||||||
|
<tr><td>l << self <td>__rlshift__ <td>y << x
|
||||||
|
|
||||||
|
<tr><td>self & r <td>__and__ <td>x & y
|
||||||
|
<tr><td>l & self <td>__rand__ <td>y & x
|
||||||
|
|
||||||
|
<tr><td>self ^ r <td>__xor__ <td>x ^ y
|
||||||
|
<tr><td>l ^ self <td>__rxor__ <td>y ^ x
|
||||||
|
|
||||||
|
<tr><td>self | r <td>__or__ <td>x | y
|
||||||
|
<tr><td>l | self <td>__ror__ <td>y | x
|
||||||
|
|
||||||
|
<tr><td>pow(self, r) <td>__pow__ <td>pow(x, y)
|
||||||
|
<tr><td>pow(l, self) <td>__rpow__ <td>pow(y, x)
|
||||||
|
|
||||||
|
</code>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
<h4><a name="self_t-spec-unary-ops"></a>Class
|
||||||
|
<code>self_t</code> unary operations</h4>
|
||||||
|
|
||||||
|
<table border="1">
|
||||||
|
<tr><th>C++ Expression <th>Python Method Name <th>C++ Implementation
|
||||||
|
<code>
|
||||||
|
|
||||||
|
<tr><td>-self <td>__neg__ <td>-x
|
||||||
|
<tr><td>+self<td>__pos__ <td>+x
|
||||||
|
<tr><td>~self<td>__invert__ <td>~x
|
||||||
|
|
||||||
|
</code>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
<h4><a name="self_t-spec-value-ops"></a>Class
|
||||||
|
<code>self_t</code> value operations</h4>
|
||||||
|
|
||||||
|
<table border="1">
|
||||||
|
<tr><th>C++ Expression <th>Python Method Name <th>C++ Implementation
|
||||||
|
<code>
|
||||||
|
|
||||||
|
<tr><td>int_(self)<td>__int__ <td>long(x)
|
||||||
|
<tr><td>long_<td>__long__ <td>PyLong_FromLong(x)
|
||||||
|
<tr><td>float_<td>__float__ <td>double(x)
|
||||||
|
<tr><td>complex_<td>__complex__ <td>std::complex<double>(x)
|
||||||
|
<tr><td>str<td>__str__ <td><a href="../../../conversion/lexical_cast.htm#lexical_cast">lexical_cast</a><std::string>(x)
|
||||||
|
|
||||||
|
</code>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h3><a name="other-spec"></a>Class Template <code>other</code></h3>
|
||||||
|
|
||||||
|
<p>Instances of <code>other<T></code> can be used in
|
||||||
|
operator expressions with <a href="#self-spec">self</a>; the
|
||||||
|
result is equivalent to the same expression with a <code>T</code>
|
||||||
|
object in place of <code>other<T></code>. Use
|
||||||
|
<code>other<T></code> to prevent construction of a
|
||||||
|
<code>T</code> object in case it is heavyweight, when no
|
||||||
|
constructor is available, or simply for clarity.
|
||||||
|
|
||||||
|
<h4><a name="other-spec-synopsis"></a>Class Template other synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
template <class T>
|
||||||
|
struct other
|
||||||
|
{
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<!-- -->
|
||||||
|
|
||||||
|
<h3><a name="operator_-spec"></a>Class Template <code>detail::operator_</code></h3>
|
||||||
|
|
||||||
|
<p>Instantiations of <code>detail::operator_<></code> are
|
||||||
|
used as the return type of operator expressions involving <code><a
|
||||||
|
href="#self-spec">self</a></code>. This should be considered an
|
||||||
|
implementation detail and is only documented here as a way of
|
||||||
|
showing how the result of <code>self</code>-expressions match
|
||||||
|
calls to <a
|
||||||
|
href="class.html#class_-spec-modifiers">class_<>::def()</a>.
|
||||||
|
|
||||||
|
<h4><a name="operator_-spec-synopsis"></a>Class Template
|
||||||
|
<code>detail::operator_</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python { namespace detail
|
||||||
|
{
|
||||||
|
template <<i>unspecified</i>>
|
||||||
|
struct operator_
|
||||||
|
{
|
||||||
|
};
|
||||||
|
}}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h2><a name="objects"></a>Objects</h2>
|
||||||
|
|
||||||
|
<p><a name="self-spec"><code>self</code></a>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
extern self_ns self;
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example</h2>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
#include <boost/python/module.hpp>
|
||||||
|
#include <boost/python/class.hpp>
|
||||||
|
#include <boost/python/operators.hpp>
|
||||||
|
#include <boost/operators.hpp>
|
||||||
|
|
||||||
|
struct number
|
||||||
|
: boost::<a href="../../../utility/operators.htm#grpd_oprs">integer_arithmetic</a><number>
|
||||||
|
{
|
||||||
|
number(long x_) : x(x_) {}
|
||||||
|
operator long() const { return x; }
|
||||||
|
|
||||||
|
number& operator+=(number const& rhs)
|
||||||
|
{ x += rhs }
|
||||||
|
number& operator-=(number const& rhs);
|
||||||
|
{ x -= rhs }
|
||||||
|
number& operator*=(number const& rhs)
|
||||||
|
{ x *= rhs }
|
||||||
|
number& operator/=(number const& rhs);
|
||||||
|
{ x /= rhs }
|
||||||
|
number& operator%=(number const& rhs);
|
||||||
|
{ x %= rhs }
|
||||||
|
|
||||||
|
long x;
|
||||||
|
};
|
||||||
|
|
||||||
|
using namespace boost::python;
|
||||||
|
BOOST_PYTHON_MODULE_INIT(demo)
|
||||||
|
{
|
||||||
|
module("demo")
|
||||||
|
.add(
|
||||||
|
class_<number>("number")
|
||||||
|
// interoperate with self
|
||||||
|
.def(self += self)
|
||||||
|
.def(self + self)
|
||||||
|
.def(self -= self)
|
||||||
|
.def(self - self)
|
||||||
|
.def(self *= self)
|
||||||
|
.def(self * self)
|
||||||
|
.def(self /= self)
|
||||||
|
.def(self / self)
|
||||||
|
.def(self %= self)
|
||||||
|
.def(self % self)
|
||||||
|
|
||||||
|
// Convert to Python int
|
||||||
|
.def(int_(self))
|
||||||
|
|
||||||
|
// interoperate with long
|
||||||
|
.def(self += long())
|
||||||
|
.def(self + long())
|
||||||
|
.def(long() + self)
|
||||||
|
.def(self -= long())
|
||||||
|
.def(self - long())
|
||||||
|
.def(long() - self)
|
||||||
|
.def(self *= long())
|
||||||
|
.def(self * long())
|
||||||
|
.def(long() * self)
|
||||||
|
.def(self /= long())
|
||||||
|
.def(self / long())
|
||||||
|
.def(long() / self)
|
||||||
|
.def(self %= long())
|
||||||
|
.def(self % long())
|
||||||
|
.def(long() % self)
|
||||||
|
|
||||||
|
)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
3 June, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
48
doc/v2/overview.html
Normal file
48
doc/v2/overview.html
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
<title>Boost.Python - Overview</title>
|
||||||
|
</head>
|
||||||
|
<body link="#0000ff" vlink="#800080">
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
<h2 align="center">Overview</h2>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="#introduction">Introduction</a></dt>
|
||||||
|
<dt><a href="#topic1">First topic</a></dt>
|
||||||
|
<dt><a href="#topic2">Second topic</a></dt>
|
||||||
|
<dt><a href="#footnotes">Footnotes</a></dt>
|
||||||
|
</dl>
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
<p>{{text}}</p>
|
||||||
|
<h2><a name="topic1"></a>First Topic</h2>
|
||||||
|
<p>{{text}}</p>
|
||||||
|
<h2><a name="topic2"></a>Second Topic</h2>
|
||||||
|
<p>{{text}}</p>
|
||||||
|
<h2><a name="footnotes"></a>Footnotes</h2>
|
||||||
|
<dl>
|
||||||
|
<dt><a name="footnote1" class="footnote">(1)</a> {{text}}</dt>
|
||||||
|
<dt><a name="footnote2" class="footnote">(2)</a> {{text}}</dt>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
05 November, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
</p>
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave Abrahams</a>
|
||||||
|
2002. All Rights Reserved.</i></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
44
doc/v2/progress_reports.html
Normal file
44
doc/v2/progress_reports.html
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
<title>Boost.Python - Progress Reports</title>
|
||||||
|
</head>
|
||||||
|
<body link="#0000ff" vlink="#800080">
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
<h2 align="center">Progress Reports</h2>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
Monthly progress reports are required as part of Boost Consulting's
|
||||||
|
contract with LLNL for Boost.Python development. These reports contain
|
||||||
|
a useful record of the project history, including the rationale for
|
||||||
|
design decisions and links to relevant discussions.
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="feb2002.html">February 2002</a></dt>
|
||||||
|
<dt><a href="Mar2002.html">March 2002</a></dt>
|
||||||
|
<dt><a href="Apr2002.html">April 2002</a></dt>
|
||||||
|
<dt><a href="May2002.html">May 2002</a></dt>
|
||||||
|
<dt><a href="Jun2002.html">June 2002</a></dt>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
18 July, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
</p>
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave Abrahams</a>
|
||||||
|
2002. All Rights Reserved.</i></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
261
doc/v2/ptr.html
Normal file
261
doc/v2/ptr.html
Normal file
@@ -0,0 +1,261 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - <boost/python/ptr.hpp></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Header <boost/python/ptr.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a>
|
||||||
|
|
||||||
|
<dt><a href="#functions">Functions</a>
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#ptr-spec">ptr</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#pointer_wrapper-spec">Class template <code>pointer_wrapper</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#pointer_wrapper-spec-synopsis">Class template <code>pointer_wrapper</code> synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#pointer_wrapper-spec-types">Class
|
||||||
|
<code>pointer_wrapper</code> types</a>
|
||||||
|
|
||||||
|
<dt><a href="#pointer_wrapper-spec-ctors">Class
|
||||||
|
<code>pointer_wrapper</code> constructors and destructor</a>
|
||||||
|
|
||||||
|
<dt><a href="#pointer_wrapper-spec-observers">Class
|
||||||
|
<code>pointer_wrapper</code> observer functions</a>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#metafunctions">Metafunctions</a>
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#is_pointer_wrapper-spec">Class template <code>is_pointer_wrapper</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#is_pointer_wrapper-spec-synopsis">Class template <code>is_pointer_wrapper</code> synopsis</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="#unwrap_pointer-spec">Class template <code>unwrap_pointer</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#unwrap_pointer-spec-synopsis">Class template <code>unwrap_pointer</code> synopsis</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example(s)</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<p><code><boost/python/ptr.hpp></code> defines the
|
||||||
|
<code>ptr()</code> function template, which allows users to
|
||||||
|
specify how to convert C++ pointer values to python in the context
|
||||||
|
of implementing overridable virtual functions, invoking Python
|
||||||
|
callable objects, or explicitly converting C++ objects to
|
||||||
|
Python. Normally, when passing pointers to Python callbacks, the
|
||||||
|
pointee is copied to ensure that the Python object
|
||||||
|
never holds a dangling reference. To specify that the new Python
|
||||||
|
object should merely contain a copy of a pointer <code>p</code>,
|
||||||
|
the user can pass <code><a href="#ptr-spec">ptr</a>(p)</code> instead of passing
|
||||||
|
<code>p</code> directly. This interface is meant to mirror the use
|
||||||
|
of <a href="../../../bind/ref.html"><code>boost::ref()</code></a>,
|
||||||
|
which can be similarly used to prevent copying of referents.
|
||||||
|
|
||||||
|
<p><code>ptr(p)</code> returns an instance of <code><a
|
||||||
|
href="#pointer_wrapper-spec">pointer_wrapper<></a></code>, which
|
||||||
|
can be detected using the <code><a
|
||||||
|
href="#is_pointer_wrapper-spec">is_pointer_wrapper<></a></code>
|
||||||
|
metafunction; <code><a
|
||||||
|
href="#unwrap_pointer-spec">unwrap_pointer<></a></code> is a
|
||||||
|
metafunction which extracts the original pointer type from a
|
||||||
|
<code>pointer_wrapper<></code>. These classes can be thought
|
||||||
|
of as implementation details.
|
||||||
|
|
||||||
|
<h2><a name="functions"></a>Functions</h2>
|
||||||
|
<pre>
|
||||||
|
|
||||||
|
<a name="ptr-spec">template <class T></a>
|
||||||
|
pointer_wrapper<T> ptr(T x);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="ptr-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>T</code> is a pointer type.
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> <code><a href="#pointer_wrapper-spec">pointer_wrapper</a><T>(x)</code>
|
||||||
|
|
||||||
|
<dt><b>Throws:</b> nothing.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="pointer_wrapper-spec"></a>Class template <code>pointer_wrapper</code></h3>
|
||||||
|
|
||||||
|
<p>A "type envelope" which is returned by <a
|
||||||
|
href="#ptr-spec">ptr()</a>, used to indicate reference semantics
|
||||||
|
for pointers passed to Python callbacks.
|
||||||
|
|
||||||
|
<h4><a name="pointer_wrapper-spec-synopsis"></a>Class
|
||||||
|
<code>pointer_wrapper</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
template<class Ptr> class pointer_wrapper
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
typedef Ptr type;
|
||||||
|
|
||||||
|
explicit pointer_wrapper(Ptr x);
|
||||||
|
operator Ptr() const;
|
||||||
|
Ptr get() const;
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="pointer_wrapper-spec-types"></a>Class template <code>pointer_wrapper</code> types</h4>
|
||||||
|
<pre>
|
||||||
|
typedef Ptr type;
|
||||||
|
</pre>
|
||||||
|
The type of the pointer being wrapped.
|
||||||
|
|
||||||
|
<h4><a name="pointer_wrapper-spec-ctors"></a>Class template <code>pointer_wrapper</code> constructors and
|
||||||
|
destructor</h4>
|
||||||
|
<pre>
|
||||||
|
explicit pointer_wrapper(Ptr x);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>Ptr</code> is a pointer type.
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> Stores <code>x</code> in a the <code>pointer_wrapper<></code>.
|
||||||
|
<dt><b>Throws:</b> nothing.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h4><a name="pointer_wrapper-spec-observers"></a>Class template <code>pointer_wrapper</code> observer
|
||||||
|
functions</h4>
|
||||||
|
<pre>
|
||||||
|
operator Ptr() const;
|
||||||
|
Ptr get() const;
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Returns:</b> a copy of the stored pointer.
|
||||||
|
<dt><b>Rationale:</b> <code>pointer_wrapper</code> is intended
|
||||||
|
to be a stand-in for the actual pointer type, but sometimes it's
|
||||||
|
better to have an explicit way to retrieve the pointer.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h3><a name="is_pointer_wrapper-spec"></a>Class template <code>is_pointer_wrapper</code></h3>
|
||||||
|
|
||||||
|
<p>A unary metafunction whose <code>value</code> is true iff its
|
||||||
|
argument is a <code>pointer_wrapper<></code>.
|
||||||
|
|
||||||
|
<h4><a name="is_pointer_wrapper-spec-synopsis"></a>Class template <code>is_pointer_wrapper</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
template<class T> class is_pointer_wrapper
|
||||||
|
{
|
||||||
|
static <i>unspecified</i> value = ...;
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
|
||||||
|
<dl class="metafunction-semantics">
|
||||||
|
<dt><b>Returns:</b> <code>true</code> iff <code>T</code> is a
|
||||||
|
specialization of
|
||||||
|
<code>pointer_wrapper<></code>.
|
||||||
|
<dt><code>value</code> is an integral constant convertible to bool of
|
||||||
|
unspecified type
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h3><a name="unwrap_pointer-spec"></a>Class template <code>unwrap_pointer</code></h3>
|
||||||
|
|
||||||
|
A unary metafunction which extracts the wrapped pointer type from a
|
||||||
|
specialization of <code>pointer_wrapper<></code>.
|
||||||
|
|
||||||
|
<h4><a name="unwrap_pointer-spec-synopsis"></a>Class template <code>unwrap_pointer</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
template<class T> class unwrap_pointer
|
||||||
|
{
|
||||||
|
typedef <i>unspecified</i> type;
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="metafunction-semantics">
|
||||||
|
<dt><b>Returns:</b> <code>T::type</code> if <code>T</code> is a
|
||||||
|
specialization of
|
||||||
|
<code>pointer_wrapper<></code>, <code>T</code> otherwise
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example(s)</h2>
|
||||||
|
|
||||||
|
This example illustrates the use of <code>ptr()</code> to prevent an
|
||||||
|
object from being copied:
|
||||||
|
<pre>
|
||||||
|
#include <boost/python/call.hpp>
|
||||||
|
#include <boost/python/ptr.hpp>
|
||||||
|
|
||||||
|
class expensive_to_copy
|
||||||
|
{
|
||||||
|
...
|
||||||
|
};
|
||||||
|
|
||||||
|
void pass_as_arg(expensive_to_copy* x, PyObject* f)
|
||||||
|
{
|
||||||
|
// call the Python function f, passing a Python object built around
|
||||||
|
// which refers to *x by-pointer.
|
||||||
|
//
|
||||||
|
// *** Note: ensuring that *x outlives the argument to f() is ***
|
||||||
|
// *** up to the user! Failure to do so could result in a crash! ***
|
||||||
|
|
||||||
|
boost::python::call<void>(f, ptr(x));
|
||||||
|
}
|
||||||
|
...
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
29 May, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
48
doc/v2/rationale.html
Normal file
48
doc/v2/rationale.html
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
<html>
|
||||||
|
<head>
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
<title>Boost.Python - Rationale</title>
|
||||||
|
</head>
|
||||||
|
<body link="#0000ff" vlink="#800080">
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
</td>
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
<h2 align="center">Rationale</h2>
|
||||||
|
</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="#introduction">Introduction</a></dt>
|
||||||
|
<dt><a href="#topic1">First topic</a></dt>
|
||||||
|
<dt><a href="#topic2">Second topic</a></dt>
|
||||||
|
<dt><a href="#footnotes">Footnotes</a></dt>
|
||||||
|
</dl>
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
<p>{{text}}</p>
|
||||||
|
<h2><a name="topic1"></a>First Topic</h2>
|
||||||
|
<p>{{text}}</p>
|
||||||
|
<h2><a name="topic2"></a>Second Topic</h2>
|
||||||
|
<p>{{text}}</p>
|
||||||
|
<h2><a name="footnotes"></a>Footnotes</h2>
|
||||||
|
<dl>
|
||||||
|
<dt><a name="footnote1" class="footnote">(1)</a> {{text}}</dt>
|
||||||
|
<dt><a name="footnote2" class="footnote">(2)</a> {{text}}</dt>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
05 November, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
</p>
|
||||||
|
<p><i>© Copyright <a href="../../../../../people/dave_abrahams.htm">Dave Abrahams</a>
|
||||||
|
2002. All Rights Reserved.</i></p>
|
||||||
|
</body>
|
||||||
|
</html>
|
||||||
611
doc/v2/reference.html
Normal file
611
doc/v2/reference.html
Normal file
@@ -0,0 +1,611 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content=
|
||||||
|
"text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - Reference</title>
|
||||||
|
<style type="text/css">
|
||||||
|
p.c3 {font-style: italic}
|
||||||
|
h2.c2 {text-align: center}
|
||||||
|
h1.c1 {text-align: center}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%"
|
||||||
|
summary="reference">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="http://www.boost.org"><img height="86" width=
|
||||||
|
"277" alt="C++ Boost" src="../../../../c++boost.gif" border=
|
||||||
|
"0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 class="c1">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 class="c2">Reference</h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="Reference">
|
||||||
|
<dt><a href="#concepts">Concepts</a>
|
||||||
|
|
||||||
|
<dt><a href="#high_level">High Level Components</a>
|
||||||
|
|
||||||
|
<dt><a href="#invocation">Function Invocation and Creation</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="#models_of_call_policies">Models of
|
||||||
|
CallPolicies</a>
|
||||||
|
|
||||||
|
<dt><a href="#models_of_result_converter">Models of
|
||||||
|
ResultConverter</a>
|
||||||
|
|
||||||
|
<dt><a href="#result_converter_generators">Models of
|
||||||
|
ResultConverterGenerator</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#type_conversion">To/From Python Type Conversion</a>
|
||||||
|
|
||||||
|
<dt><a href="#utility">Utility and Infrastructure</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
<!-- xxxxx -->
|
||||||
|
|
||||||
|
<h2><a name="concepts">Concepts</a></h2>
|
||||||
|
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"CallPolicies.html#CallPolicies-concept">CallPolicies</a>
|
||||||
|
|
||||||
|
<dt><a href=
|
||||||
|
"Dereferenceable.html#Dereferenceable-concept">Dereferenceable</a>
|
||||||
|
|
||||||
|
<dt><a href=
|
||||||
|
"Dereferenceable.html#Extractor-concept">Extractor</a>
|
||||||
|
|
||||||
|
<dt><a href=
|
||||||
|
"HolderGenerator.html#HolderGenerator-concept">HolderGenerator</a>
|
||||||
|
|
||||||
|
<dt><a href=
|
||||||
|
"ResultConverter.html#ResultConverter-concept">ResultConverter</a>
|
||||||
|
|
||||||
|
<dt><a href=
|
||||||
|
"ResultConverter.html#ResultConverterGenerator-concept">ResultConverterGenerator</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="high_level">High Level Components</a></h2>
|
||||||
|
|
||||||
|
<dl>
|
||||||
|
<dt><a href="class.html">class.hpp/class_fwd.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="class.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="class.html#class_-spec">class_</a>
|
||||||
|
|
||||||
|
<dt><a href="class.html#bases-spec">bases</a>
|
||||||
|
|
||||||
|
<dt><a href="class.html#args-spec">args</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="errors.html">errors.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="errors.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"errors.html#error_already_set-spec">error_already_set</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="errors.html#functions">Functions</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"errors.html#handle_exception-spec">handle_exception</a>
|
||||||
|
|
||||||
|
<dt><a href=
|
||||||
|
"errors.html#expect_non_null-spec">expect_non_null</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="iterator.html">iterator.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
|
||||||
|
<dt><a href="iterator.html#classes">Classes</a>
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="iterator.html#iterator-spec">iterator</a>
|
||||||
|
|
||||||
|
<dt><a href="iterator.html#iterators-spec">iterators</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="iterator.html#functions">Functions</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="iterator.html#range-spec">range</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="module.html">module.hpp</a>
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="module.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="module.html#module-spec">module</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="objects.html">objects.hpp</a>
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="objects.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="objects.html#xxx-spec">not yet
|
||||||
|
documented</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="operators.html">operators.hpp</a>
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="operators.html#classes">Classes</a>
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="operators.html#self_t-spec">self_t</a>
|
||||||
|
<dt><a href="operators.html#other-spec">other</a>
|
||||||
|
<dt><a href="operators.html#operator_-spec">operator_</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="operators.html#functions">Objects</a>
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="operators.html#self-spec">self</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="invocation">Function Invocation and Creation</a></h2>
|
||||||
|
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="call.html">call.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="call.html#functions">Functions</a>
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="call.html#call-spec">call</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="call_method.html">call_method.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="call_method.html#functions">Functions</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"call_method.html#call_method-spec">call_method</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="data_members.html">data_members.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="data_members.html#functions">Functions</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"data_members.html#make_getter-spec">make_getter</a>
|
||||||
|
|
||||||
|
<dt><a href=
|
||||||
|
"data_members.html#make_setter-spec">make_setter</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="make_function.html">make_function.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="make_function.html#classes">Functions</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"make_function.html#make_function-spec">make_function</a>
|
||||||
|
|
||||||
|
<dt><a href=
|
||||||
|
"make_function.html#make_constructor-spec">make_constructor</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="ptr.html">ptr.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="ptr.html#functions">Functions</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="ptr.html#ptr-spec">ptr</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="ptr.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"ptr.html#pointer_wrapper-spec">pointer_wrapper</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="ptr.html#metafunctions">MetaFunctions</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"ptr.html#is_pointer_wrapper-spec">is_pointer_wrapper</a>
|
||||||
|
|
||||||
|
<dt><a href=
|
||||||
|
"ptr.html#unwrap_pointer-spec">unwrap_pointer</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
<a name="models_of_call_policies"></a>
|
||||||
|
|
||||||
|
<h3>Models of CallPolicies</h3>
|
||||||
|
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"default_call_policies.html">default_call_policies.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"default_call_policies.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"default_call_policies.html#default_call_policies-spec">
|
||||||
|
default_call_policies</a>
|
||||||
|
|
||||||
|
<dt><a href=
|
||||||
|
"default_call_policies.html#default_result_converter-spec">
|
||||||
|
default_result_converter</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href=
|
||||||
|
"return_internal_reference.html">return_internal_reference.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"return_internal_reference.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"return_internal_reference.html#return_internal_reference-spec">
|
||||||
|
return_internal_reference</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href=
|
||||||
|
"return_value_policy.html">return_value_policy.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"return_value_policy.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"return_value_policy.html#return_value_policy-spec">return_value_policy</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href=
|
||||||
|
"with_custodian_and_ward.html">with_custodian_and_ward.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"with_custodian_and_ward.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"with_custodian_and_ward.html#with_custodian_and_ward-spec">
|
||||||
|
with_custodian_and_ward</a>
|
||||||
|
|
||||||
|
<dt><a href=
|
||||||
|
"with_custodian_and_ward.html#with_custodian_and_ward_postcall-spec">
|
||||||
|
with_custodian_and_ward_postcall</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
<a name="models_of_result_converter"></a>
|
||||||
|
|
||||||
|
<h3>Models of ResultConverter</h3>
|
||||||
|
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"to_python_indirect.html">to_python_indirect.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="to_python_indirect.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"to_python_indirect.html#to_python_indirect-spec">to_python_indirect</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="to_python_value.html">to_python_value.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="to_python_value.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"to_python_value.html#to_python_value-spec">to_python_value</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
<a name="result_converter_generators"></a>
|
||||||
|
|
||||||
|
<h3>Models of ResultConverterGenerator</h3>
|
||||||
|
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"copy_const_reference.html">copy_const_reference.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"copy_const_reference.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"copy_const_reference.html#copy_const_reference-spec">
|
||||||
|
copy_const_reference</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href=
|
||||||
|
"copy_non_const_reference.html">copy_non_const_reference.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"copy_non_const_reference.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"copy_non_const_reference.html#copy_non_const_reference-spec">
|
||||||
|
copy_non_const_reference</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href=
|
||||||
|
"manage_new_object.html">manage_new_object.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="manage_new_object.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"manage_new_object.html#manage_new_object-spec">manage_new_object</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href=
|
||||||
|
"reference_existing_object.html">reference_existing_object.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"reference_existing_object.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"reference_existing_object.html#reference_existing_object-spec">
|
||||||
|
reference_existing_object</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="type_conversion">To/From Python Type
|
||||||
|
Conversion</a></h2>
|
||||||
|
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="from_python.html">from_python.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="from_python.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"from_python.html#from_python-spec">from_python</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="implicit.html">implicit.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="implicit.html#functions">Functions</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"implicit.html#implicitly_convertible-spec">implicitly_convertible</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="lvalue_from_pytype.html">lvalue_from_pytype.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="lvalue_from_pytype.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"lvalue_from_pytype.html#lvalue_from_pytype-spec">lvalue_from_pytype</a>
|
||||||
|
|
||||||
|
<dt><a href=
|
||||||
|
"lvalue_from_pytype.html#extract_identity-spec">extract_identity</a>
|
||||||
|
|
||||||
|
<dt><a href=
|
||||||
|
"lvalue_from_pytype.html#extract_member-spec">extract_member</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href=
|
||||||
|
"to_python_converter.html">to_python_converter.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="to_python_converter.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"to_python_converter.html#to_python_converter-spec">to_python_converter</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="utility">Utility and Infrastructure</a></h2>
|
||||||
|
|
||||||
|
<dl>
|
||||||
|
<dt><a href="has_back_reference.html">has_back_reference.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="has_back_reference.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"has_back_reference.html#has_back_reference-spec">has_back_reference</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="instance_holder.html">instance_holder.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="instance_holder.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"instance_holder.html#instance_holder-spec">instance_holder</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="pointee.html">pointee.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="pointee.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt>class template <a href=
|
||||||
|
"pointee.html#pointee">pointee</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="reference_hpp.html">reference.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="reference_hpp.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href=
|
||||||
|
"reference_hpp.html#reference-spec">reference</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="reference_hpp.html#types">Types</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="reference_hpp.html#ref-spec">ref</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="type_id.html">type_id.hpp</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="type_id.html#functions">Functions</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="type_id.html#type_id-spec">type_id</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="type_id.html#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="index">
|
||||||
|
<dt><a href="type_id.html#type_info-spec">type_info</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
3 June, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p class="c3">© Copyright <a href=
|
||||||
|
"../../../../people/dave_abrahams.htm">Dave Abrahams</a> 2002. All
|
||||||
|
Rights Reserved.
|
||||||
|
|
||||||
161
doc/v2/reference_existing_object.html
Normal file
161
doc/v2/reference_existing_object.html
Normal file
@@ -0,0 +1,161 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python -
|
||||||
|
<boost/python/reference_existing_object.hpp></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Header
|
||||||
|
<boost/python/reference_existing_object.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#reference_existing_object-spec">Class
|
||||||
|
<code>reference_existing_object</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#reference_existing_object-spec-synopsis">Class
|
||||||
|
<code>reference_existing_object</code> synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#reference_existing_object-spec-metafunctions">Class
|
||||||
|
<code>reference_existing_object</code> metafunctions</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="reference_existing_object-spec"></a>Class
|
||||||
|
<code>reference_existing_object</code></h3>
|
||||||
|
|
||||||
|
<p><code>reference_existing_object</code> is a model of <a href=
|
||||||
|
"ResultConverter.html#ResultConverterGenerator-concept">ResultConverterGenerator</a> which can be
|
||||||
|
used to wrap C++ functions which return a reference or pointer to a C++
|
||||||
|
object. When the wrapped function is called, the value referenced by its
|
||||||
|
return value is not copied. A new Python object is created which contains a
|
||||||
|
pointer to the referent, and no attempt is made to ensure that the lifetime
|
||||||
|
of the referent is at least as long as that of the corresponding Python
|
||||||
|
object. Thus, it can be <font color="#ff0000"><b>highly
|
||||||
|
dangerous</b></font> to use <code>reference_existing_object</code> without
|
||||||
|
additional lifetime management from such models of <a href=
|
||||||
|
"CallPolicies.html">CallPolicies</a> as <a href=
|
||||||
|
"with_custodian_and_ward.html#with_custodian_and_ward-spec">with_custodian_and_ward</a>.
|
||||||
|
This class is used in the implementation of <a href=
|
||||||
|
"return_internal_reference.html#return_internal_reference-spec">return_internal_reference</a>.
|
||||||
|
|
||||||
|
<h4><a name="reference_existing_object-spec-synopsis"></a>Class
|
||||||
|
<code>reference_existing_object</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
struct reference_existing_object
|
||||||
|
{
|
||||||
|
template <class T> struct apply;
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="reference_existing_object-spec-metafunctions"></a>Class
|
||||||
|
<code>reference_existing_object</code> metafunctions</h4>
|
||||||
|
<pre>
|
||||||
|
template <class T> struct apply
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="metafunction-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>T</code> is <code>U&</code> or
|
||||||
|
<code>U*</code>for some <code>U</code>.
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> <code>typedef <a href=
|
||||||
|
"to_python_indirect.html#to_python_indirect-spec">to_python_indirect</a><T,V>
|
||||||
|
type</code>, where <code>V</code> is a <a href=
|
||||||
|
"to_python_indirect.html#HolderObjectGenerator">HolderObjectGenerator</a>
|
||||||
|
which constructs an instance holder containing an <i>unowned</i>
|
||||||
|
<code>U*</code> pointing to the referent of the wrapped function's return
|
||||||
|
value.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example</h2>
|
||||||
|
|
||||||
|
<p>In C++:
|
||||||
|
<pre>
|
||||||
|
#include <boost/python/module.hpp>
|
||||||
|
#include <boost/python/class.hpp>
|
||||||
|
#include <boost/python/reference_existing_object.hpp>
|
||||||
|
#include <boost/python/return_value_policy.hpp>
|
||||||
|
#include <utility>
|
||||||
|
|
||||||
|
// classes to wrap
|
||||||
|
struct Singleton
|
||||||
|
{
|
||||||
|
Singleton() : x(0) {}
|
||||||
|
|
||||||
|
int exchange(int n) // set x and return the old value
|
||||||
|
{
|
||||||
|
std::swap(n, x);
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
|
int x;
|
||||||
|
};
|
||||||
|
|
||||||
|
Singleton& get_it()
|
||||||
|
{
|
||||||
|
static Singleton just_one;
|
||||||
|
return just_one;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Wrapper code
|
||||||
|
using namespace boost::python;
|
||||||
|
BOOST_PYTHON_MODULE_INIT(singleton)
|
||||||
|
{
|
||||||
|
module("singleton")
|
||||||
|
.def("get_it", get_it)
|
||||||
|
.add(
|
||||||
|
class_<Singleton>()
|
||||||
|
.def("exchange", &Singleton::exchange)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
In Python:
|
||||||
|
<pre>
|
||||||
|
>>> import singleton
|
||||||
|
>>> s1 = singleton.get_it()
|
||||||
|
>>> s2 = singleton.get_it()
|
||||||
|
>>> id(s1) == id(s2) # s1 and s2 are not the same object
|
||||||
|
0
|
||||||
|
>>> s1.exchange(42) # but they reference the same C++ Singleton
|
||||||
|
0
|
||||||
|
>>> s2.exchange(99)
|
||||||
|
42
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
14 February 2002 <!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
210
doc/v2/return_internal_reference.html
Normal file
210
doc/v2/return_internal_reference.html
Normal file
@@ -0,0 +1,210 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - <boost/python/return_internal_reference.hpp></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Header <boost/python/return_internal_reference.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#return_internal_reference-spec">Class Template <code>return_internal_reference</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
|
||||||
|
<dt><a href="#return_internal_reference-spec-synopsis">Class Template
|
||||||
|
<code>return_internal_reference</code> synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#return_internal_reference-spec-statics">Class
|
||||||
|
<code>return_internal_reference</code> static functions</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<code>return_internal_reference</code> instantiations are models of <a href=
|
||||||
|
"CallPolicies.html">CallPolicies</a> which allow pointers and
|
||||||
|
references to objects held internally by a free or member function
|
||||||
|
argument or from the target of a member function to be returned
|
||||||
|
safely without making a copy of the referent. The default for its
|
||||||
|
first template argument handles the common case where the
|
||||||
|
containing object is the target (<code>*this</code>) of a wrapped
|
||||||
|
member function.
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="return_internal_reference-spec"></a>Class template <code>return_internal_reference</code></h3>
|
||||||
|
|
||||||
|
|
||||||
|
<table border="1" summary="return_internal_reference template parameters">
|
||||||
|
<caption>
|
||||||
|
<b><code>return_internal_reference</code> template parameters</b>
|
||||||
|
</caption>
|
||||||
|
<tr>
|
||||||
|
<th>Parameter
|
||||||
|
|
||||||
|
<th>Requirements
|
||||||
|
|
||||||
|
<th>Description
|
||||||
|
|
||||||
|
<th>Default
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>owner_arg</code>
|
||||||
|
|
||||||
|
<td>A positive compile-time constant of type
|
||||||
|
<code>std::size_t</code>.
|
||||||
|
|
||||||
|
<td>The index of the parameter which contains the object to
|
||||||
|
which the reference or pointer is being returned. If used to
|
||||||
|
wrap a member function, parameter 1 is the target object
|
||||||
|
(<code>*this</code>). Note that if the target Python object
|
||||||
|
type doesn't support weak references, a Python
|
||||||
|
<code>TypeError</code> exception will be raised when the
|
||||||
|
function being wrapped is called.
|
||||||
|
|
||||||
|
<td>1
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>Base</code>
|
||||||
|
|
||||||
|
<td>A model of <a href="CallPolicies.html">CallPolicies</a>
|
||||||
|
|
||||||
|
<td>Used for policy composition. Any
|
||||||
|
<code>result_converter</code> it supplies will be overridden by
|
||||||
|
<code>return_internal_reference</code>, but its
|
||||||
|
<code>precall</code> and <code>postcall</code> policies are
|
||||||
|
composed as described here <a
|
||||||
|
href="CallPolicies.html#composition">CallPolicies</a>.
|
||||||
|
|
||||||
|
<td><code><a href="default_call_policies.html#default_call_policies-spec">default_call_policies</a></code>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h4><a name="return_internal_reference-spec-synopsis"></a>Class template <code>return_internal_reference</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
template <std::size_t owner_arg = 1, class Base = default_call_policies>
|
||||||
|
struct return_internal_reference : Base
|
||||||
|
{
|
||||||
|
static PyObject* postcall(PyObject*, PyObject* result);
|
||||||
|
typedef <a href="reference_existing_object.html#reference_existing_object-spec">reference_existing_object</a> result_converter;
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="default_call_policies-spec-statics"></a>Class
|
||||||
|
<code>default_call_policies</code> static functions</h4>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
PyObject* postcall(PyObject* args, PyObject* result);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> <code><a href="http://www.python.org/doc/2.2/api/tupleObjects.html#l2h-476">PyTuple_Check</a>(args) != 0</code>
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> <code><a href="with_custodian_and_ward.html#with_custodian_and_ward_postcall-spec-statics">with_custodian_and_ward_postcall::postcall(args, result)</a></code>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example</h2>
|
||||||
|
|
||||||
|
<h3>C++ module definition</h3>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
#include <boost/python/module.hpp>
|
||||||
|
#include <boost/python/class.hpp>
|
||||||
|
#include <boost/python/return_internal_reference.hpp>
|
||||||
|
|
||||||
|
class Bar
|
||||||
|
{
|
||||||
|
Bar(int x) : x(x) {}
|
||||||
|
int get_x() const { return x; }
|
||||||
|
void set_x(int x) { this->x = x; }
|
||||||
|
private:
|
||||||
|
int x;
|
||||||
|
}
|
||||||
|
|
||||||
|
class Foo
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Foo(int x) : b(x) {}
|
||||||
|
|
||||||
|
// Returns an internal reference
|
||||||
|
Bar const& get_bar() const { return b; }
|
||||||
|
|
||||||
|
private:
|
||||||
|
Bar b;
|
||||||
|
};
|
||||||
|
|
||||||
|
using namespace boost::python;
|
||||||
|
BOOST_PYTHON_MODULE_INIT(internal_refs)
|
||||||
|
{
|
||||||
|
module m("internal_refs")
|
||||||
|
.add(
|
||||||
|
class_<Bar>()
|
||||||
|
.def("get_x", &Bar::get_x)
|
||||||
|
.def("set_x", &Bar::set_x)
|
||||||
|
)
|
||||||
|
.add(
|
||||||
|
class_<Foo>()
|
||||||
|
.def_init(args<int>())
|
||||||
|
.def("get_bar", &Foo::get_bar
|
||||||
|
, return_internal_reference<>())
|
||||||
|
)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h3>Python code</h3>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
>>> from internal_refs import *
|
||||||
|
>>> f = Foo(3)
|
||||||
|
>>> b1 = f.get_bar()
|
||||||
|
>>> b2 = f.get_bar()
|
||||||
|
>>> b1.get_x()
|
||||||
|
3
|
||||||
|
>>> b2.get_x()
|
||||||
|
3
|
||||||
|
>>> b1.set_x(42)
|
||||||
|
>>> b2.get_x()
|
||||||
|
42
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
15 February, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
148
doc/v2/return_value_policy.html
Normal file
148
doc/v2/return_value_policy.html
Normal file
@@ -0,0 +1,148 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - <boost/python/return_value_policy.hpp></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Header <boost/python/return_value_policy.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#return_value_policy-spec">Class Template <code>return_value_policy</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
|
||||||
|
<dt><a href="#return_value_policy-spec-synopsis">Class Template
|
||||||
|
<code>return_value_policy</code> synopsis</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<code>return_value_policy</code> instantiations are simply models
|
||||||
|
of <a href=
|
||||||
|
"CallPolicies.html">CallPolicies</a> which are composed of a <a href=
|
||||||
|
"ResultConverter.html#ResultConverterGenerator-concept">ResultConverterGenerator</a> and optional <code>Base</code> <a href=
|
||||||
|
"CallPolicies.html">CallPolicies</a>.
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="return_value_policy-spec"></a>Class template <code>return_value_policy</code></h3>
|
||||||
|
|
||||||
|
|
||||||
|
<table border="1" summary="return_value_policy template parameters">
|
||||||
|
<caption>
|
||||||
|
<b><code>return_value_policy</code> template parameters</b>
|
||||||
|
</caption>
|
||||||
|
<tr>
|
||||||
|
<th>Parameter
|
||||||
|
|
||||||
|
<th>Requirements
|
||||||
|
|
||||||
|
<th>Default
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><a href="ResultConverter.html#ResultConverterGenerator-concept">ResultConverterGenerator</a>
|
||||||
|
|
||||||
|
<td>A model of <a href=
|
||||||
|
"ResultConverterGenerator.html">ResultConverterGenerator</a>.
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>Base</code>
|
||||||
|
|
||||||
|
<td>A model of <a href="CallPolicies.html">CallPolicies</a>
|
||||||
|
|
||||||
|
<td><code><a href="default_call_policies.html#default_call_policies-spec">default_call_policies</a></code>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h4><a name="return_value_policy-spec-synopsis"></a>Class template <code>return_value_policy</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
template <class ResultConverterGenerator, class Base = default_call_policies>
|
||||||
|
struct return_value_policy : Base
|
||||||
|
{
|
||||||
|
typedef ResultConverterGenerator result_converter;
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example</h2>
|
||||||
|
|
||||||
|
<h3>C++ Module Definition</h3>
|
||||||
|
<pre>
|
||||||
|
#include <boost/python/module.hpp>
|
||||||
|
#include <boost/python/class.hpp>
|
||||||
|
#include <boost/python/copy_const_reference.hpp>
|
||||||
|
#include <boost/python/return_value_policy.hpp>
|
||||||
|
|
||||||
|
// classes to wrap
|
||||||
|
struct Bar { int x; }
|
||||||
|
|
||||||
|
struct Foo {
|
||||||
|
Foo(int x) : { b.x = x; }
|
||||||
|
Bar const& get_bar() const { return b; }
|
||||||
|
private:
|
||||||
|
Bar b;
|
||||||
|
};
|
||||||
|
|
||||||
|
// Wrapper code
|
||||||
|
using namespace boost::python;
|
||||||
|
BOOST_PYTHON_MODULE_INIT(my_module)
|
||||||
|
{
|
||||||
|
module("my_module")
|
||||||
|
.add(
|
||||||
|
class_<Bar>()
|
||||||
|
)
|
||||||
|
.add(
|
||||||
|
class_<Foo>()
|
||||||
|
.def_init(args<int>())
|
||||||
|
.def("get_bar", &Foo::get_bar
|
||||||
|
, return_value_policy<copy_const_reference>())
|
||||||
|
)
|
||||||
|
;
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
<h3>Python Code</h3>
|
||||||
|
<pre>
|
||||||
|
>>> from my_module import *
|
||||||
|
>>> f = Foo(3) # create a Foo object
|
||||||
|
>>> b = f.get_bar() # make a copy of the internal Bar object
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
15 February, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
189
doc/v2/to_python_converter.html
Normal file
189
doc/v2/to_python_converter.html
Normal file
@@ -0,0 +1,189 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - <boost/python/to_python_converter.hpp></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Header <boost/python/to_python_converter.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#to_python_converter-spec">Class Template <code>to_python_converter</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
|
||||||
|
<dt><a href="#to_python_converter-spec-synopsis">Class Template
|
||||||
|
<code>to_python_converter</code> synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#to_python_converter-spec-ctors">Class Template
|
||||||
|
<code>to_python_converter</code> constructor</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<code>to_python_converter</code> registers a conversion from
|
||||||
|
objects of a given C++ type into a Python object.
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="to_python_converter-spec"></a>Class template <code>to_python_converter</code></h3>
|
||||||
|
|
||||||
|
<code>to_python_converter</code> adds a wrapper around a static
|
||||||
|
member function of its second template parameter, handling
|
||||||
|
low-level details such as insertion into the converter registry.
|
||||||
|
|
||||||
|
<table border="1" summary="to_python_converter template parameters">
|
||||||
|
<caption>
|
||||||
|
<b><code>to_python_converter</code> template parameters</b><br>
|
||||||
|
In the table below, <b><code>x</code></b> denotes an object of type <code>T</code>
|
||||||
|
</caption>
|
||||||
|
<tr>
|
||||||
|
<th>Parameter
|
||||||
|
|
||||||
|
<th>Requirements
|
||||||
|
|
||||||
|
<th>Description
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>T</code>
|
||||||
|
|
||||||
|
<td>
|
||||||
|
|
||||||
|
<td>The C++ type of the source object in the conversion
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>Conversion</code>
|
||||||
|
|
||||||
|
<td><code>PyObject* p = Conversion::convert(x)</code>,<br>
|
||||||
|
if <code>p == 0</code>, <code><a href="http://www.python.org/doc/2.2/api/exceptionHandling.html#l2h-71">PyErr_Occurred</a>() != 0</code>.
|
||||||
|
|
||||||
|
<td>A class type whose static member function
|
||||||
|
<code>convert</code> does the real work of the conversion.
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h4><a name="to_python_converter-spec-synopsis"></a>Class template <code>to_python_converter</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
template <class T, class Conversion>
|
||||||
|
struct to_python_converter
|
||||||
|
{
|
||||||
|
to_python_converter();
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="to_python_converter-spec-ctors"></a>Class template <code>to_python_converter</code> constructor</h4>
|
||||||
|
<pre>
|
||||||
|
to_python_converter();
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> Registers a to_python converter which uses
|
||||||
|
<code>Conversion::convert()</code> to do its work.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example</h2>
|
||||||
|
|
||||||
|
This example presumes that someone has implemented the standard <a
|
||||||
|
href="http://www.python.org/doc/2.2/ext/dnt-basics.html">noddy example
|
||||||
|
module</a> from the Python documentation, and placed the corresponding
|
||||||
|
declarations in <code>"noddy.h"</code>. Because
|
||||||
|
<code>noddy_NoddyObject</code> is the ultimate trivial extension type,
|
||||||
|
the example is a bit contrived: it wraps a function for which all
|
||||||
|
information is contained in the <i>type</i> of its return value.
|
||||||
|
|
||||||
|
<h3>C++ module definition</h3>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
#include <boost/python/reference.hpp>
|
||||||
|
#include <boost/python/module.hpp>
|
||||||
|
#include "noddy.h"
|
||||||
|
|
||||||
|
struct tag {};
|
||||||
|
tag make_tag() { return tag(); }
|
||||||
|
|
||||||
|
using namespace boost::python;
|
||||||
|
|
||||||
|
struct tag_to_noddy
|
||||||
|
{
|
||||||
|
static PyObject* convert(tag const& x)
|
||||||
|
{
|
||||||
|
return PyObject_New(noddy_NoddyObject, &noddy_NoddyType);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
BOOST_PYTHON_MODULE_INIT(to_python_converter)
|
||||||
|
{
|
||||||
|
module("to_python_converter")
|
||||||
|
.def("make_tag", make_tag)
|
||||||
|
;
|
||||||
|
to_python_converter<tag, tag_to_noddy>();
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h3>Python code</h3>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
>>> import to_python_converter
|
||||||
|
>>> def always_none():
|
||||||
|
... return None
|
||||||
|
...
|
||||||
|
>>> def choose_function(x):
|
||||||
|
... if (x % 2 != 0):
|
||||||
|
... return to_python_converter.make_tag
|
||||||
|
... else:
|
||||||
|
... return always_none
|
||||||
|
...
|
||||||
|
>>> a = [ choose_function(x) for x in range(5) ]
|
||||||
|
>>> b = [ f() for f in a ]
|
||||||
|
>>> type(b[0])
|
||||||
|
<type 'NoneType'>
|
||||||
|
>>> type(b[1])
|
||||||
|
<type 'Noddy'>
|
||||||
|
>>> type(b[2])
|
||||||
|
<type 'NoneType'>
|
||||||
|
>>> type(b[3])
|
||||||
|
<type 'Noddy'>
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
05 November, 2001
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
194
doc/v2/to_python_indirect.html
Normal file
194
doc/v2/to_python_indirect.html
Normal file
@@ -0,0 +1,194 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - <boost/python/to_python_indirect.hpp></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Header <boost/python/to_python_indirect.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#to_python_indirect-spec">Class Template <code>to_python_indirect</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
|
||||||
|
<dt><a href="#to_python_indirect-spec-synopsis">Class Template
|
||||||
|
<code>to_python_indirect</code> synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#to_python_indirect-spec-observers">Class Template
|
||||||
|
<code>to_python_indirect</code> observer functions</a>
|
||||||
|
|
||||||
|
<dt><a href="#to_python_indirect-spec-statics">Class Template
|
||||||
|
<code>to_python_indirect</code> static functions</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<code><boost/python/to_python_indirect.hpp></code> supplies
|
||||||
|
a way to construct new Python objects that hold wrapped C++ class
|
||||||
|
instances via a pointer or smart pointer.
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="to_python_indirect-spec"></a>Class template <code>to_python_indirect</code></h3>
|
||||||
|
<p>Class template <code>to_python_indirect</code> converts objects
|
||||||
|
of its first argument type to python as extension class instances, using the ownership policy provided by its 2nd argument.
|
||||||
|
|
||||||
|
<p>
|
||||||
|
|
||||||
|
|
||||||
|
<table border="1" summary="to_python_indirect template parameters">
|
||||||
|
<caption>
|
||||||
|
<b><code>to_python_indirect</code> Requirements</b><br>
|
||||||
|
|
||||||
|
In the table below, <b><code>x</code></b> denotes an object of
|
||||||
|
type <code>T</code>, <b><code>h</code></b> denotes an
|
||||||
|
object of type
|
||||||
|
<code>boost::python::objects::instance_holder*</code>, and
|
||||||
|
<b><code>p</code></b> denotes an object of type
|
||||||
|
<code>U*</code>.
|
||||||
|
|
||||||
|
</caption>
|
||||||
|
<tr>
|
||||||
|
<th>Parameter
|
||||||
|
|
||||||
|
<th>Requirements
|
||||||
|
|
||||||
|
<th>Description
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>T</code>
|
||||||
|
|
||||||
|
<td>Either <code>U</code> <i>cv</i><code>&</code>
|
||||||
|
(where <i>cv</i> is any optional cv-qualification) or a <a
|
||||||
|
href="Dereferenceable.html">Dereferenceable</a> type such that
|
||||||
|
<code>*x</code> is convertible to <code>U const&</code>, where
|
||||||
|
<code>U</code> is a class type.
|
||||||
|
|
||||||
|
<td>A type deferencing a C++ class exposed to Python using
|
||||||
|
class template <code><a
|
||||||
|
href="class.html#class_-spec">class_</a></code>.
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>MakeHolder</code>
|
||||||
|
|
||||||
|
<td>h = MakeHolder::execute(p);
|
||||||
|
|
||||||
|
<td>A class whose static <code>execute()</code> creates an
|
||||||
|
<code>instance_holder</code>.
|
||||||
|
|
||||||
|
</table>
|
||||||
|
|
||||||
|
Instantiations of <code>to_python_indirect</code> are models of <a
|
||||||
|
href="ResultConverter.html#ResultConverter-concept">ResultConverter</a>.
|
||||||
|
|
||||||
|
|
||||||
|
<h4><a name="to_python_indirect-spec-synopsis"></a>Class template <code>to_python_indirect</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
template <class T, class MakeHolder>
|
||||||
|
struct to_python_indirect
|
||||||
|
{
|
||||||
|
static bool convertible();
|
||||||
|
PyObject* operator()(T ptr_or_reference) const;
|
||||||
|
private:
|
||||||
|
static PyTypeObject* type();
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="to_python_indirect-spec-observers"></a>Class template <code>to_python_indirect</code> observers</h4>
|
||||||
|
<pre>
|
||||||
|
PyObject* operator()(T x) const;
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
|
||||||
|
<dt><b>Requires:</b> <code>x</code> refers to an object (if it
|
||||||
|
is a pointer type, it is non-null). <code>convertible() ==
|
||||||
|
true</code>.
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> Creates an appropriately-typed Boost.Python
|
||||||
|
extension class instance, uses <code>MakeHolder</code> to create
|
||||||
|
an <code>instance_holder</code> from <code>x</code>, installs
|
||||||
|
the <code>instance_holder</code> in the new extension class
|
||||||
|
instance, and returns a pointer to it.
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
|
<h4><a name="to_python_indirect-spec-statics"></a>Class template <code>to_python_indirect</code> statics</h4>
|
||||||
|
<pre>
|
||||||
|
bool convertible();
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> Returns <code>true</code> iff any module has
|
||||||
|
registered a Python type corresponding to <code>U</code>.
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example</h2>
|
||||||
|
|
||||||
|
This example replicates the functionality of <a
|
||||||
|
href="reference_existing_object.html#reference_existing_object-spec">reference_existing_object</a>,
|
||||||
|
but without some of the compile-time error checking.
|
||||||
|
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
|
||||||
|
struct make_reference_holder
|
||||||
|
{
|
||||||
|
typedef boost::python::objects::instance_holder* result_type;
|
||||||
|
template <class T>
|
||||||
|
static result_type execute(T* p)
|
||||||
|
{
|
||||||
|
return new boost::python::objects::pointer_holder<T*, T>(p);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
struct reference_existing_object
|
||||||
|
{
|
||||||
|
// metafunction returning the <a href="ResultConverter.html#ResultConverter-concept">ResultConverter</a>
|
||||||
|
template <class T>
|
||||||
|
struct apply
|
||||||
|
{
|
||||||
|
typedef boost::python::to_python_indirect<T,make_reference_holder> type;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
16 February, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
101
doc/v2/to_python_value.html
Normal file
101
doc/v2/to_python_value.html
Normal file
@@ -0,0 +1,101 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - <boost/python/to_python_value.hpp></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Header
|
||||||
|
<boost/python/to_python_value.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#to_python_value-spec">Class
|
||||||
|
<code>to_python_value</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#to_python_value-spec-synopsis">Class template
|
||||||
|
<code>to_python_value</code> synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#to_python_value-spec-observers">Class template
|
||||||
|
<code>to_python_value</code> observer functions</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="to_python_value-spec"></a>Class template
|
||||||
|
<code>to_python_value</code></h3>
|
||||||
|
|
||||||
|
<p><code>to_python_value</code> is a model of <a href=
|
||||||
|
"ResultConverter.html#ResultConverter-concept">ResultConverter</a>
|
||||||
|
which copies its argument into a new Python object.
|
||||||
|
|
||||||
|
<h4><a name="to_python_value-spec-synopsis"></a>Class
|
||||||
|
<code>to_python_value</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
template <class T>
|
||||||
|
struct to_python_value
|
||||||
|
{
|
||||||
|
typedef typename <a href="../../../type_traits/index.htm#transformations">add_reference</a><
|
||||||
|
typename <a href="../../../type_traits/index.htm#transformations">add_const</a><T>::type
|
||||||
|
>::type argument_type;
|
||||||
|
|
||||||
|
static bool convertible();
|
||||||
|
PyObject* operator()(argument_type) const;
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="to_python_value-spec-observers"></a>Class
|
||||||
|
<code>to_python_value</code> observers</h4>
|
||||||
|
<pre>
|
||||||
|
static bool convertible();
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Returns:</b> <code>true</code> iff a converter has been registered which can convert <code>T</code> to python by-value.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
PyObject* operator()(argument_type x) const;
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> <code>convertible() == true</code>
|
||||||
|
<dt><b>Effects:</b> converts <code>x</code> to python
|
||||||
|
<dt><b>Returns:</b> the resulting Python object iff a converter for <code>T</code> has been registered, <code>0</code> otherwise.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
15 February, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
219
doc/v2/type_id.html
Executable file
219
doc/v2/type_id.html
Executable file
@@ -0,0 +1,219 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content=
|
||||||
|
"text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - <boost/python/type_id.hpp></title>
|
||||||
|
<style type="text/css">
|
||||||
|
p.c4 {font-style: italic}
|
||||||
|
span.c3 {color: #ff0000}
|
||||||
|
h2.c2 {text-align: center}
|
||||||
|
h1.c1 {text-align: center}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%"
|
||||||
|
summary="header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width=
|
||||||
|
"277" alt="C++ Boost" src="../../../../c++boost.gif" border=
|
||||||
|
"0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 class="c1">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 class="c2">Header <boost/python/type_id.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a>
|
||||||
|
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#type_info-spec">Class
|
||||||
|
<code>type_info</code></a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#type_info-spec-synopsis">Class
|
||||||
|
<code>type_info</code> synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#type_infospec-ctors">Class
|
||||||
|
<code>type_info</code> constructor</a>
|
||||||
|
|
||||||
|
<dt><a href="#type_infospec-comparisons">Class
|
||||||
|
<code>type_info</code> comparison functions</a>
|
||||||
|
|
||||||
|
<dt><a href="#type_infospec-observers">Class
|
||||||
|
<code>type_info</code> observer functions</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#functions">Functions</a>
|
||||||
|
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#type_id-spec">type_id</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="introduction"></a>Introduction</h2>
|
||||||
|
|
||||||
|
<p><code><boost/python/type_id.hpp></code> provides types and
|
||||||
|
functions for runtime type identification like those of of
|
||||||
|
<code><typeinfo></code>. It exists mostly to work around
|
||||||
|
certain compiler bugs and platform-dependent interactions with
|
||||||
|
shared libraries.
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="type_info-spec"></a>Class <code>type_info</code></h3>
|
||||||
|
|
||||||
|
<p><code>type_info</code> instances identify a type. As
|
||||||
|
<code>std::type_info</code> is specified to (but unlike its
|
||||||
|
implementation in some compilers),
|
||||||
|
<code>boost::python::type_info</code> never represents top-level
|
||||||
|
references or cv-qualification (see section 5.2.8 in the C++
|
||||||
|
standard). Unlike <code>std::type_info</code>,
|
||||||
|
<code>boost::python::type_info</code> instances are copyable, and
|
||||||
|
comparisons always work reliably across shared library boundaries.
|
||||||
|
|
||||||
|
<h4><a name="type_info-spec-synopsis"></a>Class type_info
|
||||||
|
synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
class type_info : <a href=
|
||||||
|
"../../../utility/operators.htm#totally_ordered1">totally_ordered</a><type_info>
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
// constructor
|
||||||
|
type_info(std::type_info const& = typeid(void));
|
||||||
|
|
||||||
|
// comparisons
|
||||||
|
bool operator<(type_info const& rhs) const;
|
||||||
|
bool operator==(type_info const& rhs) const;
|
||||||
|
|
||||||
|
// observers
|
||||||
|
char const* name() const;
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="type_infospec-ctors">Class <code>type_info</code>
|
||||||
|
constructor</a></h4>
|
||||||
|
<pre>
|
||||||
|
type_info(std::type_info const& = typeid(void));
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Effects:</b> constructs a <code>type_info</code> object
|
||||||
|
which identifies the same type as its argument.
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> Since it is occasionally neccessary to make
|
||||||
|
an array of <code>type_info</code> objects a benign default
|
||||||
|
argument is supplied. <span class="c3"><b>Note:</b></span> this
|
||||||
|
constructor does <i>not</i> correct for non-conformance of
|
||||||
|
compiler <code>typeid()</code> implementations. See <code><a
|
||||||
|
href="#type_id-spec">type_id</a></code>, below.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h4><a name="type_infospec-comparisons">Class
|
||||||
|
<code>type_info</code> comparisons</a></h4>
|
||||||
|
<pre>
|
||||||
|
bool operator<(type_info const& rhs) const;
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Effects:</b> yields a total order over
|
||||||
|
<code>type_info</code> objects.
|
||||||
|
</dl>
|
||||||
|
<pre>
|
||||||
|
bool operator==(type_info const& rhs) const;
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Returns:</b> <code>true</code> iff the two values describe
|
||||||
|
the same type.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Note:</b> The use of <code><a href=
|
||||||
|
"../../../utility/operators.htm#totally_ordered1">totally_ordered</a><type_info></code>
|
||||||
|
as a private base class supplies operators <code><=</code>,
|
||||||
|
<code>>=</code>, <code>></code>, and <code>!=</code>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h4><a name="type_infospec-observers">Class <code>type_info</code>
|
||||||
|
observers</a></h4>
|
||||||
|
<pre>
|
||||||
|
char const* name() const;
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Returns:</b> The result of calling <code>name()</code> on
|
||||||
|
the argument used to construct the object.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="functions"></a>Functions</h2>
|
||||||
|
<pre>
|
||||||
|
std::ostream& operator<<(std::ostream&s, type_info const&x);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Effects:</b> Writes a description of the type described by
|
||||||
|
to <code>x</code> into <code>s</code>.
|
||||||
|
|
||||||
|
<dt><b>Rationale:</b> Not every C++ implementation provides a
|
||||||
|
truly human-readable <code>type_info::name()</code> string, but
|
||||||
|
for some we may be able to decode the string and produce a
|
||||||
|
reasonable representation.
|
||||||
|
</dl>
|
||||||
|
<pre>
|
||||||
|
<a name="type_id-spec">template <class T> type_info type_id</a>()
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Returns:</b> <code>type_info(typeid(T))</code>
|
||||||
|
|
||||||
|
<dt><b>Note:</b> On some non-conforming C++ implementations, the
|
||||||
|
code is not actually as simple as described above; the semantics
|
||||||
|
are adjusted to work <i>as-if</i> the C++ implementation were
|
||||||
|
conforming.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example</h2>
|
||||||
|
The following example, though silly, illustrates how the
|
||||||
|
<code>type_id</code> facility might be used
|
||||||
|
<pre>
|
||||||
|
#include <boost/python/type_id.hpp>
|
||||||
|
|
||||||
|
// Returns true iff the user passes an int argument
|
||||||
|
template <class T>
|
||||||
|
bool is_int(T x)
|
||||||
|
{
|
||||||
|
using boost::python::type_id;
|
||||||
|
return type_id<T>() == type_id<int>();
|
||||||
|
}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
18 November, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
|
||||||
|
<p class="c4">© Copyright <a href=
|
||||||
|
"../../../../people/dave_abrahams.htm">Dave Abrahams</a> 2002. All
|
||||||
|
Rights Reserved.
|
||||||
|
|
||||||
289
doc/v2/with_custodian_and_ward.html
Normal file
289
doc/v2/with_custodian_and_ward.html
Normal file
@@ -0,0 +1,289 @@
|
|||||||
|
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
||||||
|
<meta name="generator" content="HTML Tidy, see www.w3.org">
|
||||||
|
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||||
|
<link rel="stylesheet" type="text/css" href="../boost.css">
|
||||||
|
|
||||||
|
<title>Boost.Python - <boost/python/with_custodian_and_ward.hpp></title>
|
||||||
|
|
||||||
|
<table border="0" cellpadding="7" cellspacing="0" width="100%" summary=
|
||||||
|
"header">
|
||||||
|
<tr>
|
||||||
|
<td valign="top" width="300">
|
||||||
|
<h3><a href="../../../../index.htm"><img height="86" width="277" alt=
|
||||||
|
"C++ Boost" src="../../../../c++boost.gif" border="0"></a></h3>
|
||||||
|
|
||||||
|
<td valign="top">
|
||||||
|
<h1 align="center">Boost.Python</h1>
|
||||||
|
|
||||||
|
<h2 align="center">Header <boost/python/with_custodian_and_ward.hpp></h2>
|
||||||
|
</table>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2>Contents</h2>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
<dt><a href="#introduction">Introduction</a>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="#classes">Classes</a>
|
||||||
|
<dd>
|
||||||
|
|
||||||
|
<dl class="page-index">
|
||||||
|
|
||||||
|
<dt><a href="#with_custodian_and_ward-spec">Class Template <code>with_custodian_and_ward</code></a>
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
|
||||||
|
<dt><a href="#with_custodian_and_ward-spec-synopsis">Class Template
|
||||||
|
<code>with_custodian_and_ward</code> synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#with_custodian_and_ward-spec-statics">Class
|
||||||
|
<code>with_custodian_and_ward</code> static functions</a>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
<dt><a href="#with_custodian_and_ward_postcall-spec">Class Template <code>with_custodian_and_ward_postcall</code></a>
|
||||||
|
<dd>
|
||||||
|
<dl class="page-index">
|
||||||
|
|
||||||
|
<dt><a href="#with_custodian_and_ward_postcall-spec-synopsis">Class Template
|
||||||
|
<code>with_custodian_and_ward_postcall</code> synopsis</a>
|
||||||
|
|
||||||
|
<dt><a href="#with_custodian_and_ward_postcall-spec-statics">Class
|
||||||
|
<code>with_custodian_and_ward_postcall</code> static functions</a>
|
||||||
|
</dl>
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
|
<dt><a href="#examples">Example</a>
|
||||||
|
</dl>
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
<h2><a name="introduction">Introduction</a></h2>
|
||||||
|
|
||||||
|
This header provides faciliites for establishing a lifetime
|
||||||
|
dependency between two of a function's Python argument or result
|
||||||
|
objects. The <i>ward</i> object will not be destroyed until after
|
||||||
|
the custodian as long as the <i>custodian</i> object supports <a
|
||||||
|
href="http://www.python.org/doc/current/lib/module-weakref.html">weak
|
||||||
|
references</a> (Boost.Python extension classes all support weak
|
||||||
|
references). The two class templates
|
||||||
|
<code>with_custodian_and_ward</code> and
|
||||||
|
<code>with_custodian_and_ward_postcall</code> differ in the point
|
||||||
|
at which they take effect.
|
||||||
|
|
||||||
|
<p>In order to reduce the chance of inadvertently
|
||||||
|
creating dangling pointers, the default is to do lifetime binding
|
||||||
|
<i>before</i> the underlying C++ object is invoked. However,
|
||||||
|
before invocation the result object is not available, so
|
||||||
|
<code>with_custodian_and_ward_postcall</code> is provided to bind
|
||||||
|
lifetimes after invocation. Also, if a C++ exception is thrown
|
||||||
|
after <code>with_custodian_and_ward<>::precall</code> but
|
||||||
|
before the underlying C++ object actually stores a pointer, the
|
||||||
|
lifetime of the custodian and ward objects will be artificially
|
||||||
|
bound together, so one might choose
|
||||||
|
<code>with_custodian_and_ward_postcall</code> instead, depending
|
||||||
|
on the semantics of the function being wrapped.
|
||||||
|
|
||||||
|
<h2><a name="classes"></a>Classes</h2>
|
||||||
|
|
||||||
|
<h3><a name="with_custodian_and_ward-spec"></a>Class template <code>with_custodian_and_ward</code></h3>
|
||||||
|
|
||||||
|
|
||||||
|
<table border="1" summary="with_custodian_and_ward template parameters">
|
||||||
|
<caption>
|
||||||
|
<b><code>with_custodian_and_ward</code> template parameters</b>
|
||||||
|
</caption>
|
||||||
|
<tr>
|
||||||
|
<th>Parameter
|
||||||
|
|
||||||
|
<th>Requirements
|
||||||
|
|
||||||
|
<th>Description
|
||||||
|
|
||||||
|
<th>Default
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>custodian</code>
|
||||||
|
|
||||||
|
<td>A positive compile-time constant of type
|
||||||
|
<code>std::size_t</code>.
|
||||||
|
|
||||||
|
<td>The 1-based index of the parameter which is the dependency in the
|
||||||
|
lifetime relationship to be established. If used to
|
||||||
|
wrap a member function, parameter 1 is the target object
|
||||||
|
(<code>*this</code>). Note that if the target Python object
|
||||||
|
type doesn't support weak references, a Python
|
||||||
|
<code>TypeError</code> exception will be raised when the
|
||||||
|
C++ object being wrapped is called.
|
||||||
|
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>ward</code>
|
||||||
|
|
||||||
|
<td>A positive compile-time constant of type
|
||||||
|
<code>std::size_t</code>.
|
||||||
|
|
||||||
|
<td>The 1-based index of the parameter which is the dependent in the
|
||||||
|
lifetime relationship to be established. If used to
|
||||||
|
wrap a member function, parameter 1 is the target object
|
||||||
|
(<code>*this</code>).
|
||||||
|
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>Base</code>
|
||||||
|
|
||||||
|
<td>A model of <a href="CallPolicies.html">CallPolicies</a>
|
||||||
|
|
||||||
|
<td>Used for <a href="CallPolicies.html#composition">policy composition</a>.
|
||||||
|
|
||||||
|
<td><code><a href="default_call_policies.html#default_call_policies-spec">default_call_policies</a></code>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h4><a name="with_custodian_and_ward-spec-synopsis"></a>Class template <code>with_custodian_and_ward</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
template <std::size_t custodian, std::size_t ward, class Base = default_call_policies>
|
||||||
|
struct with_custodian_and_ward : Base
|
||||||
|
{
|
||||||
|
static bool precall(PyObject* args);
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="with_custodian_and_ward-spec-statics"></a>Class
|
||||||
|
<code>with_custodian_and_ward</code> static functions</h4>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
bool precall(PyObject* args);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> <code><a href="http://www.python.org/doc/2.2/api/tupleObjects.html#l2h-476">PyTuple_Check</a>(args) != 0</code>
|
||||||
|
<dt><b>Effects:</b> Makes the lifetime of the argument indicated
|
||||||
|
by <code>ward</code> dependent on the lifetime of the argument
|
||||||
|
indicated by <code>custodian</code>.
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> <code>false</code> and <code><a
|
||||||
|
href="http://www.python.org/doc/2.2/api/exceptionHandling.html#l2h-71">PyErr_Occurred</a>() != 0</code>
|
||||||
|
upon failure, <code>true</code> otherwise.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- xxxxxx -->
|
||||||
|
|
||||||
|
<h3><a name="with_custodian_and_ward_postcall-spec"></a>Class template <code>with_custodian_and_ward_postcall</code></h3>
|
||||||
|
|
||||||
|
|
||||||
|
<table border="1" summary="with_custodian_and_ward_postcall template parameters">
|
||||||
|
<caption>
|
||||||
|
<b><code>with_custodian_and_ward_postcall</code> template parameters</b>
|
||||||
|
</caption>
|
||||||
|
<tr>
|
||||||
|
<th>Parameter
|
||||||
|
|
||||||
|
<th>Requirements
|
||||||
|
|
||||||
|
<th>Description
|
||||||
|
|
||||||
|
<th>Default
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>custodian</code>
|
||||||
|
|
||||||
|
<td>A compile-time constant of type
|
||||||
|
<code>std::size_t</code>.
|
||||||
|
|
||||||
|
<td>The index of the parameter which is the dependency in the
|
||||||
|
lifetime relationship to be established. Zero indicates the
|
||||||
|
result object; 1 indicates the first argument. If used to wrap
|
||||||
|
a member function, parameter 1 is the target object
|
||||||
|
(<code>*this</code>). Note that if the target Python object
|
||||||
|
type doesn't support weak references, a Python
|
||||||
|
<code>TypeError</code> exception will be raised when the
|
||||||
|
C++ object being wrapped is called.
|
||||||
|
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>ward</code>
|
||||||
|
|
||||||
|
<td>A compile-time constant of type <code>std::size_t</code>.
|
||||||
|
|
||||||
|
<td>The index of the parameter which is the dependent in the
|
||||||
|
lifetime relationship to be established. Zero indicates the
|
||||||
|
result object; 1 indicates the first argument. If used to wrap
|
||||||
|
a member function, parameter 1 is the target object
|
||||||
|
(<code>*this</code>).
|
||||||
|
|
||||||
|
<tr>
|
||||||
|
<td><code>Base</code>
|
||||||
|
|
||||||
|
<td>A model of <a href="CallPolicies.html">CallPolicies</a>
|
||||||
|
|
||||||
|
<td>Used for <a href="CallPolicies.html#composition">policy
|
||||||
|
composition</a>.
|
||||||
|
|
||||||
|
<td><code><a href="default_call_policies.html#default_call_policies-spec">default_call_policies</a></code>
|
||||||
|
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<h4><a name="with_custodian_and_ward_postcall-spec-synopsis"></a>Class template <code>with_custodian_and_ward_postcall</code> synopsis</h4>
|
||||||
|
<pre>
|
||||||
|
namespace boost { namespace python
|
||||||
|
{
|
||||||
|
template <std::size_t custodian, std::size_t ward, class Base = default_call_policies>
|
||||||
|
struct with_custodian_and_ward_postcall : Base
|
||||||
|
{
|
||||||
|
static PyObject* postcall(PyObject* args, PyObject* result);
|
||||||
|
};
|
||||||
|
}}
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<h4><a name="with_custodian_and_ward_postcall-spec-statics"></a>Class
|
||||||
|
<code>with_custodian_and_ward_postcall</code> static functions</h4>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
PyObject* postcall(PyObject* args, PyObject* result);
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<dl class="function-semantics">
|
||||||
|
<dt><b>Requires:</b> <code><a
|
||||||
|
href="http://www.python.org/doc/2.2/api/tupleObjects.html#l2h-476">PyTuple_Check</a>(args)
|
||||||
|
!= 0</code>, <code>result != 0</code>.
|
||||||
|
|
||||||
|
<dt><b>Effects:</b> Makes the lifetime of the object indicated
|
||||||
|
by <code>ward</code> dependent on the lifetime of the object
|
||||||
|
indicated by <code>custodian</code>.
|
||||||
|
|
||||||
|
<dt><b>Returns:</b> <code>0</code> and <code><a
|
||||||
|
href="http://www.python.org/doc/2.2/api/exceptionHandling.html#l2h-71">PyErr_Occurred</a>() != 0</code>
|
||||||
|
upon failure, <code>true</code> otherwise.
|
||||||
|
</dl>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<h2><a name="examples"></a>Example</h2>
|
||||||
|
|
||||||
|
The following example shows how
|
||||||
|
<code>with_custodian_and_ward_postcall</code> is used by the library
|
||||||
|
to implement <code><a
|
||||||
|
href="return_internal_reference.html#return_internal_reference-spec">return_internal_reference</a></code>
|
||||||
|
|
||||||
|
<pre>
|
||||||
|
template <std::size_t owner_arg = 1, class Base = default_call_policies>
|
||||||
|
struct return_internal_reference
|
||||||
|
: with_custodian_and_ward_postcall<0, owner_arg, Base>
|
||||||
|
{
|
||||||
|
typedef <a href="reference_existing_object.html#reference_existing_object-spec">reference_existing_object</a> result_converter;
|
||||||
|
};
|
||||||
|
</pre>
|
||||||
|
|
||||||
|
<p>Revised
|
||||||
|
<!--webbot bot="Timestamp" S-Type="EDITED" S-Format="%d %B, %Y" startspan -->
|
||||||
|
29 May, 2002
|
||||||
|
<!--webbot bot="Timestamp" endspan i-checksum="39359" -->
|
||||||
|
|
||||||
|
<p><i>© Copyright <a href="../../../../people/dave_abrahams.htm">Dave
|
||||||
|
Abrahams</a> 2002. All Rights Reserved.</i>
|
||||||
|
|
||||||
BIN
example/Attic/project.zip
Normal file
BIN
example/Attic/project.zip
Normal file
Binary file not shown.
39
example/Jamfile
Normal file
39
example/Jamfile
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
# Specify our location in the boost project hierarchy
|
||||||
|
subproject libs/python/example ;
|
||||||
|
|
||||||
|
# Declares the following targets:
|
||||||
|
#
|
||||||
|
# 1. an extension module called "getting_started1", which is
|
||||||
|
# built from "getting_started1.cpp". Built by default
|
||||||
|
#
|
||||||
|
# 2. A test target called my-test.test which runs
|
||||||
|
# test_getting_started1.py with the extension module above. Built
|
||||||
|
# when out-of date, but only if invoked by name or if the global
|
||||||
|
# "test" target is invoked.
|
||||||
|
#
|
||||||
|
# 3. A test target called my-test.run wihch runs the above test
|
||||||
|
# unconditionally. Built only when invoked by name.
|
||||||
|
#
|
||||||
|
# To see verbose test output, add "-sPYTHON_TEST_ARGS=-v" to the bjam
|
||||||
|
# command-line before the first target.
|
||||||
|
#
|
||||||
|
|
||||||
|
# Include definitions needed for Python modules
|
||||||
|
SEARCH on python.jam = $(BOOST_BUILD_PATH) ;
|
||||||
|
include python.jam ;
|
||||||
|
|
||||||
|
# Declare a Python extension called getting_started1
|
||||||
|
extension getting_started1
|
||||||
|
: # sources
|
||||||
|
getting_started1.cpp
|
||||||
|
|
||||||
|
# dependencies
|
||||||
|
<dll>../build/boost_python
|
||||||
|
;
|
||||||
|
|
||||||
|
# Declare a test for the extension module
|
||||||
|
boost-python-runtest my-test
|
||||||
|
: # Python test driver
|
||||||
|
test_getting_started1.py
|
||||||
|
# extension modules to use
|
||||||
|
<pyd>getting_started1 ;
|
||||||
@@ -19,6 +19,3 @@ Examples for the cross-module support are provided by:
|
|||||||
ivect.cpp
|
ivect.cpp
|
||||||
See also: libs/python/doc/cross_module.html
|
See also: libs/python/doc/cross_module.html
|
||||||
|
|
||||||
The files example1.cpp and rwgk1.cpp are obsolete. They are only
|
|
||||||
included because the Visual Studio project in the build directory still
|
|
||||||
refers to them.
|
|
||||||
|
|||||||
@@ -77,7 +77,7 @@ BOOST_PYTHON_BEGIN_CONVERSION_NAMESPACE
|
|||||||
if (tup.size() != 3) {
|
if (tup.size() != 3) {
|
||||||
PyErr_SetString(PyExc_ValueError,
|
PyErr_SetString(PyExc_ValueError,
|
||||||
"expecting exactly 3 values in tuple.");
|
"expecting exactly 3 values in tuple.");
|
||||||
throw python::error_already_set();
|
python::throw_error_already_set();
|
||||||
}
|
}
|
||||||
MillerIndex result;
|
MillerIndex result;
|
||||||
for (int i = 0; i < 3; i++)
|
for (int i = 0; i < 3; i++)
|
||||||
@@ -107,8 +107,6 @@ BOOST_PYTHON_END_CONVERSION_NAMESPACE
|
|||||||
|
|
||||||
BOOST_PYTHON_MODULE_INIT(do_it_yourself_convts)
|
BOOST_PYTHON_MODULE_INIT(do_it_yourself_convts)
|
||||||
{
|
{
|
||||||
try
|
|
||||||
{
|
|
||||||
// Create an object representing this extension module.
|
// Create an object representing this extension module.
|
||||||
python::module_builder this_module("do_it_yourself_convts");
|
python::module_builder this_module("do_it_yourself_convts");
|
||||||
|
|
||||||
@@ -120,9 +118,4 @@ BOOST_PYTHON_MODULE_INIT(do_it_yourself_convts)
|
|||||||
// Add the member functions.
|
// Add the member functions.
|
||||||
ixset_class.def(&IndexingSet::add, "add");
|
ixset_class.def(&IndexingSet::add, "add");
|
||||||
ixset_class.def(&IndexingSet::get, "get");
|
ixset_class.def(&IndexingSet::get, "get");
|
||||||
}
|
|
||||||
catch(...)
|
|
||||||
{
|
|
||||||
python::handle_exception(); // Deal with the exception for Python
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,8 +32,6 @@ extern "C" void (*old_translator)(unsigned int, EXCEPTION_POINTERS*)
|
|||||||
|
|
||||||
BOOST_PYTHON_MODULE_INIT(dvect)
|
BOOST_PYTHON_MODULE_INIT(dvect)
|
||||||
{
|
{
|
||||||
try
|
|
||||||
{
|
|
||||||
python::module_builder this_module("dvect");
|
python::module_builder this_module("dvect");
|
||||||
|
|
||||||
python::class_builder<vects::dvect> dvect_class(this_module, "dvect");
|
python::class_builder<vects::dvect> dvect_class(this_module, "dvect");
|
||||||
@@ -47,10 +45,4 @@ BOOST_PYTHON_MODULE_INIT(dvect)
|
|||||||
|
|
||||||
# include "dvect_defs.cpp"
|
# include "dvect_defs.cpp"
|
||||||
# include "ivect_defs.cpp"
|
# include "ivect_defs.cpp"
|
||||||
}
|
|
||||||
catch(...)
|
|
||||||
{
|
|
||||||
python::handle_exception(); // Deal with the exception for Python
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ namespace vects {
|
|||||||
struct dvect : public std::vector<double>
|
struct dvect : public std::vector<double>
|
||||||
{
|
{
|
||||||
dvect() : std::vector<double>() {}
|
dvect() : std::vector<double>() {}
|
||||||
dvect(size_t n) : std::vector<double>(n) {}
|
dvect(std::size_t n) : std::vector<double>(n) {}
|
||||||
dvect(boost::python::tuple tuple) : std::vector<double>(tuple.size())
|
dvect(boost::python::tuple tuple) : std::vector<double>(tuple.size())
|
||||||
{
|
{
|
||||||
std::vector<double>::iterator v_it = begin();
|
std::vector<double>::iterator v_it = begin();
|
||||||
|
|||||||
@@ -1,54 +0,0 @@
|
|||||||
#include <string.h>
|
|
||||||
|
|
||||||
namespace hello {
|
|
||||||
class world
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
world(int) {}
|
|
||||||
~world() {}
|
|
||||||
const char* get() const { return "hi, world"; }
|
|
||||||
};
|
|
||||||
|
|
||||||
size_t length(const world& x) { return strlen(x.get()); }
|
|
||||||
}
|
|
||||||
|
|
||||||
#include <boost/python/class_builder.hpp>
|
|
||||||
|
|
||||||
// Python requires an exported function called init<module-name> in every
|
|
||||||
// extension module. This is where we build the module contents.
|
|
||||||
extern "C"
|
|
||||||
#ifdef _WIN32
|
|
||||||
__declspec(dllexport)
|
|
||||||
#endif
|
|
||||||
void inithello()
|
|
||||||
{
|
|
||||||
try
|
|
||||||
{
|
|
||||||
// create an object representing this extension module
|
|
||||||
boost::python::module_builder hello("hello");
|
|
||||||
|
|
||||||
// Create the Python type object for our extension class
|
|
||||||
boost::python::class_builder<hello::world> world_class(hello, "world");
|
|
||||||
|
|
||||||
// Add the __init__ function
|
|
||||||
world_class.def(boost::python::constructor<int>());
|
|
||||||
// Add a regular member function
|
|
||||||
world_class.def(&hello::world::get, "get");
|
|
||||||
|
|
||||||
// Add a regular function to the module
|
|
||||||
hello.def(hello::length, "length");
|
|
||||||
}
|
|
||||||
catch(...)
|
|
||||||
{
|
|
||||||
boost::python::handle_exception(); // Deal with the exception for Python
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Win32 DLL boilerplate
|
|
||||||
#if defined(_WIN32)
|
|
||||||
#include <windows.h>
|
|
||||||
extern "C" BOOL WINAPI DllMain(HINSTANCE, DWORD, LPVOID)
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
#endif // _WIN32
|
|
||||||
@@ -16,17 +16,15 @@ namespace python = boost::python;
|
|||||||
// extension module. This is where we build the module contents.
|
// extension module. This is where we build the module contents.
|
||||||
BOOST_PYTHON_MODULE_INIT(getting_started1)
|
BOOST_PYTHON_MODULE_INIT(getting_started1)
|
||||||
{
|
{
|
||||||
try
|
try {
|
||||||
{
|
|
||||||
// Create an object representing this extension module.
|
// Create an object representing this extension module.
|
||||||
python::module_builder this_module("getting_started1");
|
python::module_builder this_module("getting_started1");
|
||||||
|
|
||||||
// Add regular functions to the module.
|
// Add regular functions to the module.
|
||||||
this_module.def(greet, "greet");
|
this_module.def(greet, "greet");
|
||||||
this_module.def(square, "square");
|
this_module.def(square, "square");
|
||||||
}
|
}
|
||||||
catch(...)
|
catch(...) {
|
||||||
{
|
boost::python::handle_exception();
|
||||||
python::handle_exception(); // Deal with the exception for Python
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,8 +26,6 @@ namespace python = boost::python;
|
|||||||
|
|
||||||
BOOST_PYTHON_MODULE_INIT(getting_started2)
|
BOOST_PYTHON_MODULE_INIT(getting_started2)
|
||||||
{
|
{
|
||||||
try
|
|
||||||
{
|
|
||||||
// Create an object representing this extension module.
|
// Create an object representing this extension module.
|
||||||
python::module_builder this_module("getting_started2");
|
python::module_builder this_module("getting_started2");
|
||||||
|
|
||||||
@@ -44,9 +42,4 @@ BOOST_PYTHON_MODULE_INIT(getting_started2)
|
|||||||
|
|
||||||
// Even better, invite() can also be made a member of hello_class!!!
|
// Even better, invite() can also be made a member of hello_class!!!
|
||||||
hello_class.def(invite, "invite");
|
hello_class.def(invite, "invite");
|
||||||
}
|
|
||||||
catch(...)
|
|
||||||
{
|
|
||||||
python::handle_exception(); // Deal with the exception for Python
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -32,8 +32,6 @@ extern "C" void (*old_translator)(unsigned int, EXCEPTION_POINTERS*)
|
|||||||
|
|
||||||
BOOST_PYTHON_MODULE_INIT(ivect)
|
BOOST_PYTHON_MODULE_INIT(ivect)
|
||||||
{
|
{
|
||||||
try
|
|
||||||
{
|
|
||||||
python::module_builder this_module("ivect");
|
python::module_builder this_module("ivect");
|
||||||
|
|
||||||
python::class_builder<vects::ivect> ivect_class(this_module, "ivect");
|
python::class_builder<vects::ivect> ivect_class(this_module, "ivect");
|
||||||
@@ -47,10 +45,5 @@ BOOST_PYTHON_MODULE_INIT(ivect)
|
|||||||
|
|
||||||
# include "dvect_defs.cpp"
|
# include "dvect_defs.cpp"
|
||||||
# include "ivect_defs.cpp"
|
# include "ivect_defs.cpp"
|
||||||
}
|
|
||||||
catch(...)
|
|
||||||
{
|
|
||||||
python::handle_exception(); // Deal with the exception for Python
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ namespace vects {
|
|||||||
struct ivect : public std::vector<int>
|
struct ivect : public std::vector<int>
|
||||||
{
|
{
|
||||||
ivect() : std::vector<int>() {}
|
ivect() : std::vector<int>() {}
|
||||||
ivect(size_t n) : std::vector<int>(n) {}
|
ivect(std::size_t n) : std::vector<int>(n) {}
|
||||||
ivect(boost::python::tuple tuple) : std::vector<int>(tuple.size())
|
ivect(boost::python::tuple tuple) : std::vector<int>(tuple.size())
|
||||||
{
|
{
|
||||||
std::vector<int>::iterator v_it = begin();
|
std::vector<int>::iterator v_it = begin();
|
||||||
|
|||||||
37
example/nested.cpp
Normal file
37
example/nested.cpp
Normal file
@@ -0,0 +1,37 @@
|
|||||||
|
// Example by Ralf W. Grosse-Kunstleve
|
||||||
|
|
||||||
|
/*
|
||||||
|
This example shows how convert a nested Python tuple.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <boost/python/class_builder.hpp>
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
namespace {
|
||||||
|
|
||||||
|
boost::python::list
|
||||||
|
show_nested_tuples(boost::python::tuple outer)
|
||||||
|
{
|
||||||
|
boost::python::list result;
|
||||||
|
for (int i = 0; i < outer.size(); i++) {
|
||||||
|
boost::python::tuple inner(
|
||||||
|
BOOST_PYTHON_CONVERSION::from_python(outer[i].get(),
|
||||||
|
boost::python::type<boost::python::tuple>()));
|
||||||
|
for (int j = 0; j < inner.size(); j++) {
|
||||||
|
double x = BOOST_PYTHON_CONVERSION::from_python(inner[j].get(),
|
||||||
|
boost::python::type<double>());
|
||||||
|
char buf[128];
|
||||||
|
sprintf(buf, "(%d,%d) %.6g", i, j, x);
|
||||||
|
result.append(BOOST_PYTHON_CONVERSION::to_python(std::string(buf)));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
BOOST_PYTHON_MODULE_INIT(nested)
|
||||||
|
{
|
||||||
|
boost::python::module_builder this_module("nested");
|
||||||
|
this_module.def(show_nested_tuples, "show_nested_tuples");
|
||||||
|
}
|
||||||
@@ -18,8 +18,6 @@ extern "C" void (*old_translator)(unsigned int, EXCEPTION_POINTERS*)
|
|||||||
|
|
||||||
BOOST_PYTHON_MODULE_INIT(noncopyable_export)
|
BOOST_PYTHON_MODULE_INIT(noncopyable_export)
|
||||||
{
|
{
|
||||||
try
|
|
||||||
{
|
|
||||||
python::module_builder this_module("noncopyable_export");
|
python::module_builder this_module("noncopyable_export");
|
||||||
|
|
||||||
python::class_builder<store> store_class(this_module, "store");
|
python::class_builder<store> store_class(this_module, "store");
|
||||||
@@ -27,9 +25,4 @@ BOOST_PYTHON_MODULE_INIT(noncopyable_export)
|
|||||||
|
|
||||||
store_class.def(python::constructor<int>());
|
store_class.def(python::constructor<int>());
|
||||||
store_class.def(&store::recall, "recall");
|
store_class.def(&store::recall, "recall");
|
||||||
}
|
|
||||||
catch(...)
|
|
||||||
{
|
|
||||||
python::handle_exception(); // Deal with the exception for Python
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -31,8 +31,6 @@ extern "C" void (*old_translator)(unsigned int, EXCEPTION_POINTERS*)
|
|||||||
|
|
||||||
BOOST_PYTHON_MODULE_INIT(noncopyable_import)
|
BOOST_PYTHON_MODULE_INIT(noncopyable_import)
|
||||||
{
|
{
|
||||||
try
|
|
||||||
{
|
|
||||||
python::module_builder this_module("noncopyable_import");
|
python::module_builder this_module("noncopyable_import");
|
||||||
|
|
||||||
python::import_converters<store>
|
python::import_converters<store>
|
||||||
@@ -44,9 +42,4 @@ BOOST_PYTHON_MODULE_INIT(noncopyable_import)
|
|||||||
// However, to keep this example simple, we only define a
|
// However, to keep this example simple, we only define a
|
||||||
// module-level function.
|
// module-level function.
|
||||||
this_module.def(add_stores, "add_stores");
|
this_module.def(add_stores, "add_stores");
|
||||||
}
|
|
||||||
catch(...)
|
|
||||||
{
|
|
||||||
python::handle_exception(); // Deal with the exception for Python
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,8 +41,6 @@ namespace { // Avoid cluttering the global namespace.
|
|||||||
|
|
||||||
BOOST_PYTHON_MODULE_INIT(pickle1)
|
BOOST_PYTHON_MODULE_INIT(pickle1)
|
||||||
{
|
{
|
||||||
try
|
|
||||||
{
|
|
||||||
// Create an object representing this extension module.
|
// Create an object representing this extension module.
|
||||||
python::module_builder this_module("pickle1");
|
python::module_builder this_module("pickle1");
|
||||||
|
|
||||||
@@ -56,9 +54,4 @@ BOOST_PYTHON_MODULE_INIT(pickle1)
|
|||||||
|
|
||||||
// Support for pickle.
|
// Support for pickle.
|
||||||
world_class.def(world_getinitargs, "__getinitargs__");
|
world_class.def(world_getinitargs, "__getinitargs__");
|
||||||
}
|
|
||||||
catch(...)
|
|
||||||
{
|
|
||||||
python::handle_exception(); // Deal with the exception for Python
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -63,7 +63,7 @@ namespace { // Avoid cluttering the global namespace.
|
|||||||
if (state.size() != 1) {
|
if (state.size() != 1) {
|
||||||
PyErr_SetString(PyExc_ValueError,
|
PyErr_SetString(PyExc_ValueError,
|
||||||
"Unexpected argument in call to __setstate__.");
|
"Unexpected argument in call to __setstate__.");
|
||||||
throw python::error_already_set();
|
python::throw_error_already_set();
|
||||||
}
|
}
|
||||||
int number = from_python(state[0].get(), python::type<int>());
|
int number = from_python(state[0].get(), python::type<int>());
|
||||||
if (number != 42)
|
if (number != 42)
|
||||||
@@ -73,8 +73,6 @@ namespace { // Avoid cluttering the global namespace.
|
|||||||
|
|
||||||
BOOST_PYTHON_MODULE_INIT(pickle2)
|
BOOST_PYTHON_MODULE_INIT(pickle2)
|
||||||
{
|
{
|
||||||
try
|
|
||||||
{
|
|
||||||
// Create an object representing this extension module.
|
// Create an object representing this extension module.
|
||||||
python::module_builder this_module("pickle2");
|
python::module_builder this_module("pickle2");
|
||||||
|
|
||||||
@@ -92,9 +90,4 @@ BOOST_PYTHON_MODULE_INIT(pickle2)
|
|||||||
world_class.def(world_getinitargs, "__getinitargs__");
|
world_class.def(world_getinitargs, "__getinitargs__");
|
||||||
world_class.def(world_getstate, "__getstate__");
|
world_class.def(world_getstate, "__getstate__");
|
||||||
world_class.def(world_setstate, "__setstate__");
|
world_class.def(world_setstate, "__setstate__");
|
||||||
}
|
|
||||||
catch(...)
|
|
||||||
{
|
|
||||||
python::handle_exception(); // Deal with the exception for Python
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -65,8 +65,6 @@ namespace { // Avoid cluttering the global namespace.
|
|||||||
|
|
||||||
BOOST_PYTHON_MODULE_INIT(pickle3)
|
BOOST_PYTHON_MODULE_INIT(pickle3)
|
||||||
{
|
{
|
||||||
try
|
|
||||||
{
|
|
||||||
// Create an object representing this extension module.
|
// Create an object representing this extension module.
|
||||||
python::module_builder this_module("pickle3");
|
python::module_builder this_module("pickle3");
|
||||||
|
|
||||||
@@ -85,11 +83,6 @@ BOOST_PYTHON_MODULE_INIT(pickle3)
|
|||||||
world_class.def_raw(world_getstate, "__getstate__");
|
world_class.def_raw(world_getstate, "__getstate__");
|
||||||
world_class.def_raw(world_setstate, "__setstate__");
|
world_class.def_raw(world_setstate, "__setstate__");
|
||||||
world_class.getstate_manages_dict();
|
world_class.getstate_manages_dict();
|
||||||
}
|
|
||||||
catch(...)
|
|
||||||
{
|
|
||||||
python::handle_exception(); // Deal with the exception for Python
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
namespace {
|
namespace {
|
||||||
@@ -106,7 +99,7 @@ namespace {
|
|||||||
{
|
{
|
||||||
if(args.size() != 1 || keywords.size() != 0) {
|
if(args.size() != 1 || keywords.size() != 0) {
|
||||||
PyErr_SetString(PyExc_TypeError, "wrong number of arguments");
|
PyErr_SetString(PyExc_TypeError, "wrong number of arguments");
|
||||||
throw boost::python::error_already_set();
|
boost::python::throw_error_already_set();
|
||||||
}
|
}
|
||||||
const world& w = from_python(args[0].get(), type<const world&>());
|
const world& w = from_python(args[0].get(), type<const world&>());
|
||||||
ref mydict = getattr(args[0], "__dict__");
|
ref mydict = getattr(args[0], "__dict__");
|
||||||
@@ -122,7 +115,7 @@ namespace {
|
|||||||
{
|
{
|
||||||
if(args.size() != 2 || keywords.size() != 0) {
|
if(args.size() != 2 || keywords.size() != 0) {
|
||||||
PyErr_SetString(PyExc_TypeError, "wrong number of arguments");
|
PyErr_SetString(PyExc_TypeError, "wrong number of arguments");
|
||||||
throw boost::python::error_already_set();
|
boost::python::throw_error_already_set();
|
||||||
}
|
}
|
||||||
world& w = from_python(args[0].get(), type<world&>());
|
world& w = from_python(args[0].get(), type<world&>());
|
||||||
ref mydict = getattr(args[0], "__dict__");
|
ref mydict = getattr(args[0], "__dict__");
|
||||||
@@ -130,7 +123,7 @@ namespace {
|
|||||||
if (state.size() != 2) {
|
if (state.size() != 2) {
|
||||||
PyErr_SetString(PyExc_ValueError,
|
PyErr_SetString(PyExc_ValueError,
|
||||||
"Unexpected argument in call to __setstate__.");
|
"Unexpected argument in call to __setstate__.");
|
||||||
throw python::error_already_set();
|
python::throw_error_already_set();
|
||||||
}
|
}
|
||||||
// restore the object's __dict__
|
// restore the object's __dict__
|
||||||
dictionary odict = from_python(mydict.get(), type<dictionary>());
|
dictionary odict = from_python(mydict.get(), type<dictionary>());
|
||||||
|
|||||||
BIN
example/project.zip
Normal file
BIN
example/project.zip
Normal file
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user